001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.sql.framework.codegen.oracle8;
042:
043: import org.apache.velocity.VelocityContext;
044: import org.netbeans.modules.sql.framework.codegen.AbstractGenerator;
045: import org.netbeans.modules.sql.framework.codegen.StatementContext;
046: import org.netbeans.modules.sql.framework.codegen.TemplateBuilder;
047: import org.netbeans.modules.sql.framework.model.ColumnRef;
048: import org.netbeans.modules.sql.framework.model.SQLConstants;
049: import org.netbeans.modules.sql.framework.model.SQLJoinOperator;
050: import org.netbeans.modules.sql.framework.model.SQLObject;
051: import org.netbeans.modules.sql.framework.model.SQLPredicate;
052: import org.netbeans.modules.sql.framework.model.impl.VisibleSQLPredicateImpl;
053:
054: import com.sun.sql.framework.exception.BaseException;
055:
056: /**
057: * Overrides parent implementation to handle construction of Oracle 8i-specific join
058: * condition syntax.
059: *
060: * @author Jonathan Giron
061: * @version $Revision$
062: */
063: public class Oracle8PredicateGenerator extends AbstractGenerator {
064:
065: private static final String JOIN_SYMBOL = "(+)";
066:
067: public String generate(SQLObject obj, StatementContext context)
068: throws BaseException {
069: SQLPredicate predicate = (SQLPredicate) obj;
070: boolean showParenthesis = predicate.isShowParenthesis();
071:
072: SQLObject leftObj = predicate.getSQLObject(SQLPredicate.LEFT);
073: SQLObject rightObj = predicate.getSQLObject(SQLPredicate.RIGHT);
074: String leftExpression = "";
075: String rightExpression = "";
076: String operator = predicate.getOperatorType();
077:
078: if (!(predicate instanceof VisibleSQLPredicateImpl.RightUnary)) {
079: leftExpression = this .getDB().getGeneratorFactory()
080: .generate(leftObj, context);
081: }
082:
083: if (predicate instanceof VisibleSQLPredicateImpl.LeftUnary) {
084: if ((operator != null)
085: && (operator.equalsIgnoreCase("is") || operator
086: .equalsIgnoreCase("is not"))) {
087: rightExpression = "NULL";
088: }
089: } else {
090: rightExpression = this .getDB().getGeneratorFactory()
091: .generate(rightObj, context);
092: }
093:
094: boolean leftObjIsColumn = (leftObj instanceof ColumnRef);
095: boolean rightObjIsColumn = (rightObj instanceof ColumnRef);
096:
097: SQLJoinOperator join = (SQLJoinOperator) context
098: .getClientProperty(StatementContext.JOIN_OPERATOR);
099: if (join != null) {
100: switch (join.getJoinType()) {
101: case SQLConstants.LEFT_OUTER_JOIN:
102: if (leftObjIsColumn) {
103: rightExpression += JOIN_SYMBOL;
104: }
105: break;
106:
107: case SQLConstants.RIGHT_OUTER_JOIN:
108: if (rightObjIsColumn) {
109: leftExpression += JOIN_SYMBOL;
110: }
111: break;
112:
113: case SQLConstants.FULL_OUTER_JOIN:
114: throw new BaseException("Not yet implemented.");
115:
116: case SQLConstants.INNER_JOIN:
117: default:
118: // Do nothing.
119: break;
120: }
121: }
122:
123: VelocityContext vContext = new VelocityContext();
124: vContext.put("leftExpression", leftExpression);
125: vContext.put("rightExpression", rightExpression);
126: vContext.put("operator", operator);
127: vContext.put("showParenthesis", new Boolean(showParenthesis));
128:
129: return TemplateBuilder.generateSql(this .getDB()
130: .getTemplateFileName("predicate"), vContext);
131: }
132: }
|