001: /**
002: * Copyright 2006 Webmedia Group Ltd.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: **/package org.araneaframework.backend.list.helper.builder.compexpr;
016:
017: import java.util.Comparator;
018:
019: import org.apache.commons.logging.Log;
020: import org.apache.commons.logging.LogFactory;
021: import org.araneaframework.backend.list.SqlExpression;
022: import org.araneaframework.backend.list.helper.builder.CompExprToSqlExprBuilder;
023: import org.araneaframework.backend.list.memorybased.ComparatorExpression;
024: import org.araneaframework.backend.list.memorybased.Variable;
025: import org.araneaframework.backend.list.memorybased.compexpr.LazyComparatorExpression;
026: import org.araneaframework.backend.list.memorybased.compexpr.MultiComparatorExpression;
027: import org.araneaframework.backend.list.memorybased.compexpr.NopComparatorExpression;
028: import org.araneaframework.backend.list.memorybased.compexpr.ReverseComparatorExpression;
029: import org.araneaframework.backend.list.memorybased.compexpr.VariableComparatorExpression;
030: import org.araneaframework.backend.list.memorybased.expression.VariableResolver;
031: import org.araneaframework.backend.list.sqlexpr.SqlCollectionExpression;
032: import org.araneaframework.backend.list.sqlexpr.constant.SqlStringExpression;
033: import org.araneaframework.backend.list.sqlexpr.order.SqlAscendingExpression;
034: import org.araneaframework.backend.list.sqlexpr.order.SqlDescendingExpression;
035: import org.araneaframework.backend.list.sqlexpr.string.SqlUpperExpression;
036: import org.araneaframework.uilib.list.util.comparator.NullComparator;
037: import org.araneaframework.uilib.list.util.comparator.StringComparator;
038:
039: public class StandardCompExprToSqlExprBuilder extends
040: BaseCompExprToSqlExprBuilder {
041:
042: static final Log log = LogFactory
043: .getLog(StandardCompExprToSqlExprBuilder.class);
044:
045: protected VariableResolver mapper;
046:
047: public StandardCompExprToSqlExprBuilder() {
048: addTranslator(NopComparatorExpression.class,
049: new NopComparatorTranslator());
050: addTranslator(LazyComparatorExpression.class,
051: new LazyComparatorTranslator());
052: addTranslator(MultiComparatorExpression.class,
053: new MultiComparatorTranslator());
054: addTranslator(VariableComparatorExpression.class,
055: new VariableComparatorTranslator());
056: addTranslator(ReverseComparatorExpression.class,
057: new ReverseComparatorTranslator());
058: }
059:
060: public void setMapper(VariableResolver mapper) {
061: this .mapper = mapper;
062: }
063:
064: protected String resolveVariable(Variable variable) {
065: return this .mapper != null ? (String) this .mapper
066: .resolve(variable) : variable.getName();
067: }
068:
069: // NopComparatorExpression must be the root
070: static class NopComparatorTranslator implements
071: CompExprToSqlExprTranslator {
072: public SqlExpression translate(ComparatorExpression expr,
073: CompExprToSqlExprBuilder builder) {
074: return null;
075: }
076: }
077:
078: class LazyComparatorTranslator implements
079: CompExprToSqlExprTranslator {
080: public SqlExpression translate(ComparatorExpression expr,
081: CompExprToSqlExprBuilder builder) {
082: LazyComparatorExpression lazyExpr = (LazyComparatorExpression) expr;
083: return buildSqlExpression(lazyExpr
084: .getComparatorExpression());
085: }
086: }
087:
088: static class MultiComparatorTranslator extends
089: CompositeCompExprToSqlExprTranslator {
090: protected SqlExpression translateParent(
091: ComparatorExpression expr, SqlExpression[] sqlChildren) {
092: return new SqlCollectionExpression()
093: .setChildren(sqlChildren);
094: }
095: }
096:
097: class VariableComparatorTranslator implements
098: CompExprToSqlExprTranslator {
099: public SqlExpression translate(ComparatorExpression expr,
100: CompExprToSqlExprBuilder builder) {
101: log.debug("Translating VariableComparatorExpression");
102: VariableComparatorExpression compExpr = (VariableComparatorExpression) expr;
103: return new SqlAscendingExpression(
104: translateVariableComparatorInternal(compExpr));
105: }
106: }
107:
108: class ReverseComparatorTranslator implements
109: CompExprToSqlExprTranslator {
110: public SqlExpression translate(ComparatorExpression expr,
111: CompExprToSqlExprBuilder builder) {
112: log.debug("Translating ReverseComparatorExpression");
113: ReverseComparatorExpression parent = (ReverseComparatorExpression) expr;
114: VariableComparatorExpression compExpr = (VariableComparatorExpression) parent
115: .getChildren()[0];
116: return new SqlDescendingExpression(
117: translateVariableComparatorInternal(compExpr));
118: }
119: }
120:
121: SqlExpression translateVariableComparatorInternal(
122: VariableComparatorExpression compExpr) {
123: SqlExpression temp = new SqlStringExpression(
124: resolveVariable(compExpr));
125: Comparator comparator = compExpr.getComparator();
126: if (comparator instanceof NullComparator) {
127: comparator = ((NullComparator) comparator)
128: .getNotNullComparator();
129: }
130: log.debug("Comparator: " + comparator);
131: if (StringComparator.class.isAssignableFrom(comparator
132: .getClass())) {
133: if (((StringComparator) comparator).getIgnoreCase()) {
134: temp = new SqlUpperExpression(temp);
135: }
136: }
137: return temp;
138: }
139: }
|