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.model.utils;
042:
043: import java.util.Iterator;
044: import java.util.List;
045: import java.util.Map;
046:
047: import org.netbeans.modules.sql.framework.model.SQLCanvasObject;
048: import org.netbeans.modules.sql.framework.model.SQLCondition;
049: import org.netbeans.modules.sql.framework.model.SQLConnectableObject;
050: import org.netbeans.modules.sql.framework.model.SQLDefinition;
051: import org.netbeans.modules.sql.framework.model.SQLInputObject;
052: import org.netbeans.modules.sql.framework.model.SQLObject;
053: import org.netbeans.modules.sql.framework.parser.conditionparser.SQLConditionParser;
054:
055: import com.sun.sql.framework.exception.BaseException;
056:
057: /**
058: * @author Ritesh Adval
059: */
060: public class ConditionUtil {
061:
062: /**
063: * Parses into a SQLObject the given condition string using information from the given
064: * SQLDefinition.
065: *
066: * @param text condition text to be parsed
067: * @param def SQLDefinition
068: * @return SQLObject modeling the parsed condition string in <code>text</code>
069: * @throws Exception if error occurs during parsing
070: */
071: public static SQLObject parseCondition(String text,
072: SQLDefinition def) throws Exception {
073: SQLConditionParser p = new SQLConditionParser();
074: SQLParserUtil helper = new SQLParserUtil(def);
075: p.setSQLParserUtil(helper);
076: SQLObject obj = null;
077: if (text != null && !text.trim().equals("")) {
078: obj = p.parse(text);
079: }
080: return obj;
081: }
082:
083: /**
084: * Populates the given SQLCondition object using information from the given condition
085: * string and SQLDefinition.
086: *
087: * @param condition SQLCondition object to be populated
088: * @param def SQLDefinition
089: * @param text condition text to be parsed
090: * @throws Exception if error occurs during parsing or object population
091: */
092: public static void populateCondition(SQLCondition condition,
093: SQLDefinition def, String text) throws Exception {
094: SQLObject rootObj = parseCondition(text, def);
095: if (rootObj != null && rootObj instanceof SQLConnectableObject) {
096: SQLConnectableObject expObj = (SQLConnectableObject) rootObj;
097: populateExpressionObject(expObj, condition);
098: }
099: }
100:
101: /**
102: * Populates the given SQLCondition object using information from the given SQLObject
103: * root.
104: *
105: * @param condition SQLCondition object to be populated
106: * @param rootObj root expression object
107: * @throws Exception if error occurs during parsing or object population
108: */
109: public static void populateCondition(SQLCondition condition,
110: SQLObject rootObj) throws Exception {
111: if (rootObj != null && rootObj instanceof SQLConnectableObject) {
112: SQLConnectableObject expObj = (SQLConnectableObject) rootObj;
113: populateExpressionObject(expObj, condition);
114: }
115: }
116:
117: private static void populateChildObject(SQLObject obj,
118: SQLCondition condition) throws BaseException {
119: List childList = obj.getChildSQLObjects();
120: Iterator it = childList.iterator();
121:
122: while (it.hasNext()) {
123: SQLObject chldObj = (SQLObject) it.next();
124: if (chldObj instanceof SQLConnectableObject) {
125: populateExpressionObject(
126: (SQLConnectableObject) chldObj, condition);
127: } else {
128: populateLeafObject(chldObj, condition);
129: }
130: }
131: }
132:
133: private static void populateExpressionObject(
134: SQLConnectableObject expObj, SQLCondition condition)
135: throws BaseException {
136: // add the expression object to condition
137: condition.addObject(expObj);
138:
139: // now go through the inputs of expression object and add them also in condition
140: Map inputMap = expObj.getInputObjectMap();
141: Iterator it = inputMap.keySet().iterator();
142:
143: while (it.hasNext()) {
144: String argName = (String) it.next();
145: SQLInputObject inputObj = (SQLInputObject) inputMap
146: .get(argName);
147: SQLObject srcObj = inputObj.getSQLObject();
148: // if srcObj is a SQLCanvasObject then only we can add
149: // it to the condition. condition holds all SQLCanvasObject
150: // which can be linked.
151: // This srcObj may not be a SQLCanvasObject if it is
152: // a part of object like SQLLiteral for literal values
153: if (srcObj instanceof SQLCanvasObject) {
154: if (srcObj instanceof SQLConnectableObject) {
155: populateExpressionObject(
156: (SQLConnectableObject) srcObj, condition);
157: } else {
158: populateLeafObject(srcObj, condition);
159: }
160: }
161: }
162:
163: populateChildObject(expObj, condition);
164: }
165:
166: private static void populateLeafObject(SQLObject obj,
167: SQLCondition condition) throws BaseException {
168: condition.addObject(obj);
169: }
170:
171: /** Creates a new instance of ConditionUtil */
172: private ConditionUtil() {
173: }
174: }
|