1 16 package org.outerj.daisy.query.model; 17 18 import org.outerj.daisy.query.QueryContext; 19 import org.outerj.daisy.repository.query.QueryException; 20 import org.outerj.daisy.repository.query.EvaluationContext; 21 22 import java.util.List ; 23 import java.util.ArrayList ; 24 import java.util.Iterator ; 25 import java.sql.PreparedStatement ; 26 import java.sql.SQLException ; 27 28 public abstract class AbstractFunction implements Function { 29 protected List params = new ArrayList (4); 30 private int line = -1; 31 private int column = -1; 32 33 public void setLocation(int line, int column) { 34 this.line = line; 35 this.column = column; 36 } 37 38 public String getLocation() { 39 if (line == -1 && column == -1) 40 return "(location unknown)"; 41 else 42 return "line " + line + ", column " + column; 43 } 44 45 public int getLine() { 46 return line; 47 } 48 49 public int getColumn() { 50 return column; 51 } 52 53 public void addParam(ValueExpr param) { 54 params.add(param); 55 } 56 57 protected ValueExpr getParam(int index) { 58 return (ValueExpr)params.get(index); 59 } 60 61 public void prepare(QueryContext context) throws QueryException { 62 if (params.size() == 0) 63 return; 64 Iterator paramsIt = params.iterator(); 65 while (paramsIt.hasNext()) { 66 ((ValueExpr)paramsIt.next()).prepare(context); 67 } 68 } 69 70 public String getSqlPreConditions(SqlGenerationContext context) throws QueryException { 71 if (params.size() == 0) 72 return null; 73 StringBuffer preConds = new StringBuffer (); 74 Iterator paramsIt = params.iterator(); 75 while (paramsIt.hasNext()) { 76 ValueExpr param = (ValueExpr)paramsIt.next(); 77 String preCond = param.getSqlPreConditions(context); 78 if (preCond != null) { 79 if (preConds.length() > 0) 80 preConds.append(" and "); 81 preConds.append(preCond); 82 } 83 } 84 return preConds.length() > 0 ? preConds.toString() : null; 85 } 86 87 public int bindPreConditions(PreparedStatement stmt, int bindPos) throws SQLException , QueryException { 88 if (params.size() == 0) 89 return bindPos; 90 Iterator paramsIt = params.iterator(); 91 while (paramsIt.hasNext()) { 92 ValueExpr param = (ValueExpr)paramsIt.next(); 93 bindPos = param.bindPreConditions(stmt, bindPos); 94 } 95 return bindPos; 96 } 97 98 public boolean isSymbolicIdentifier() { 99 return false; 100 } 101 102 public boolean isMultiValue() { 103 return false; 104 } 105 106 public boolean isOutputOnly() { 107 Iterator paramsIt = params.iterator(); 108 while (paramsIt.hasNext()) { 109 ValueExpr param = (ValueExpr)paramsIt.next(); 110 if (param.isOutputOnly()) 111 return true; 112 } 113 return false; 114 } 115 116 public AclConditionViolation isAclAllowed() { 117 Iterator paramsIt = params.iterator(); 118 while (paramsIt.hasNext()) { 119 ValueExpr param = (ValueExpr)paramsIt.next(); 120 AclConditionViolation violation = param.isAclAllowed(); 121 if (violation != null) 122 return violation; 123 } 124 return null; 125 } 126 127 public Object translateSymbolic(ValueExpr valueExpr, EvaluationContext evaluationContext) throws QueryException { 128 throw new QueryException("translateSymbolic should not be called if isSymbolic returns false"); 129 } 130 131 public void generateSqlValueExpr(StringBuffer sql, SqlGenerationContext context) throws QueryException { 132 Iterator paramsIt = params.iterator(); 133 boolean first = true; 134 while (paramsIt.hasNext()) { 135 if (first) 136 first = false; 137 else 138 sql.append(", "); 139 ValueExpr param = (ValueExpr)paramsIt.next(); 140 param.generateSqlValueExpr(sql, context); 141 } 142 } 143 144 public int bindValueExpr(PreparedStatement stmt, int bindPos, QValueType valueType, EvaluationContext evaluationContext) throws SQLException , QueryException { 145 Iterator paramsIt = params.iterator(); 146 while (paramsIt.hasNext()) { 147 ValueExpr param = (ValueExpr)paramsIt.next(); 148 bindPos = param.bindValueExpr(stmt, bindPos, valueType, evaluationContext); 149 } 150 return bindPos; 151 } 152 153 public String getExpression() { 154 StringBuffer expression = new StringBuffer (); 155 expression.append(getFunctionName()).append("("); 156 boolean first = true; 157 Iterator paramsIt = params.iterator(); 158 while (paramsIt.hasNext()) { 159 if (first) 160 first = false; 161 else 162 expression.append(", "); 163 ValueExpr valueExpr = (ValueExpr)paramsIt.next(); 164 expression.append(valueExpr.getExpression()); 165 } 166 expression.append(")"); 167 return expression.toString(); 168 } 169 170 public boolean canTestAppliesTo() { 171 Iterator paramsIt = params.iterator(); 172 while (paramsIt.hasNext()) { 173 ValueExpr param = (ValueExpr)paramsIt.next(); 174 if (!param.canTestAppliesTo()) 175 return false; 176 } 177 return true; 178 } 179 } 180 | Popular Tags |