package com.idega.block.dataquery.data.sql; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import com.idega.block.dataquery.data.xml.QueryBooleanExpressionPart; import com.idega.util.StringHandler; /** * <p>Title: idegaWeb</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: idega Software</p> * @author <a href="thomas@idega.is">Thomas Hilbig</a> * @version 1.0 * Created on Nov 19, 2003 */ public class CriteriaExpression implements DynamicExpression { private final static String LEFT_BRACKET = "("; private final static String RIGHT_BRACKET = ")"; private boolean isDynamic = false; private String booleanExpression = null; private Map idCriterionMap = new LinkedHashMap(0); public CriteriaExpression(QueryBooleanExpressionPart booleanExpressionPart) { this.booleanExpression = booleanExpressionPart.getBooleanExpression(); } public void add(CriterionExpression criterion) { // criteria is dynamic if it contains at least one dynamic criterion this.isDynamic = this.isDynamic || criterion.isDynamic(); this.idCriterionMap.put(criterion.getId(), criterion); } /* (non-Javadoc) * @see com.idega.block.dataquery.data.sql.DynamicExpression#isDynamic() */ public boolean isDynamic() { return this.isDynamic; } /* (non-Javadoc) * @see com.idega.block.dataquery.data.sql.DynamicExpression#getIdentifierValueMap() */ /* (non-Javadoc) * @see com.idega.block.dataquery.data.sql.DynamicExpression#getIdentifierDescriptionMap() */ public Map getIdentifierInputDescriptionMap() { Map resultMap = new LinkedHashMap(); Iterator iterator = this.idCriterionMap.values().iterator(); while(iterator.hasNext()) { CriterionExpression expression = (CriterionExpression) iterator.next(); if (expression.isDynamic()) { resultMap.putAll(expression.getIdentifierInputDescriptionMap()); } } return resultMap; } public Map getIdentifierValueMap() { Map resultMap = new LinkedHashMap(); Iterator iterator = this.idCriterionMap.values().iterator(); while(iterator.hasNext()) { CriterionExpression expression = (CriterionExpression) iterator.next(); if (expression.isDynamic()) { resultMap.putAll(expression.getIdentifierValueMap()); } } return resultMap; } public void setIdentifierValueMap(Map identifierValueMap) { Iterator iterator = this.idCriterionMap.values().iterator(); while(iterator.hasNext()) { CriterionExpression expression = (CriterionExpression) iterator.next(); if (expression.isDynamic()) { expression.setIdentifierValueMap(identifierValueMap); } } } /* (non-Javadoc) * @see com.idega.block.dataquery.data.sql.Expression#toSQLString() */ public String toSQLString() { Map replaceMap = new HashMap(); Iterator iterator = this.idCriterionMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String key = (String) entry.getKey(); CriterionExpression criterion = (CriterionExpression) entry.getValue(); String value = criterion.toSQLString(); StringBuffer buffer = new StringBuffer(LEFT_BRACKET); buffer.append(value).append(RIGHT_BRACKET); replaceMap.putAll(StringHandler.getReplaceMapIgnoreCase(this.booleanExpression, key, buffer.toString())); } // replace the booleanExpression int index = 0; StringBuffer buffer = new StringBuffer(); while (index < this.booleanExpression.length()) { Integer indexInt = new Integer(index); String replace = null; if (replaceMap.containsKey(indexInt)) { replace = (String) replaceMap.get(indexInt); index++; } else { replace = this.booleanExpression.substring(index, ++index); } if (replace != null) { buffer.append(replace); } } return buffer.toString(); } /* (non-Javadoc) * @see com.idega.block.dataquery.data.sql.Expression#isValid() */ public boolean isValid() { return true; } }