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.impl;
042:
043: import org.netbeans.modules.sql.framework.common.utils.TagParserUtility;
044: import org.netbeans.modules.sql.framework.model.GUIInfo;
045: import org.netbeans.modules.sql.framework.model.SQLConstants;
046: import org.netbeans.modules.sql.framework.model.SQLDefinition;
047: import org.netbeans.modules.sql.framework.model.SQLJoinTable;
048: import org.netbeans.modules.sql.framework.model.SQLJoinView;
049: import org.netbeans.modules.sql.framework.model.SQLObject;
050: import org.netbeans.modules.sql.framework.model.SourceTable;
051: import org.w3c.dom.Element;
052: import org.w3c.dom.Node;
053: import org.w3c.dom.NodeList;
054: import net.java.hulp.i18n.Logger;
055: import com.sun.sql.framework.exception.BaseException;
056: import org.netbeans.modules.etl.logger.Localizer;
057: import org.netbeans.modules.etl.logger.LogUtil;
058:
059: /**
060: * @author Ritesh Adval
061: */
062: public class SQLJoinTableImpl extends AbstractSQLObject implements
063: SQLJoinTable {
064:
065: private static final String LOG_CATEGORY = SQLJoinTableImpl.class
066: .getName();
067: private static transient final Logger mLogger = LogUtil
068: .getLogger(SQLJoinTableImpl.class.getName());
069: private static transient final Localizer mLoc = Localizer.get();
070: private GUIInfo guiInfo = new GUIInfo();
071: private SourceTable table;
072:
073: /**
074: * Creates a new default instance of SQLJoinTable.
075: */
076: public SQLJoinTableImpl() {
077: this .type = SQLConstants.JOIN_TABLE;
078: }
079:
080: /**
081: * Creates a new instance of SQLJoinTable.
082: *
083: * @param tbl underlying SourceTable to associate with this instance.
084: */
085: public SQLJoinTableImpl(SourceTable tbl) {
086: this ();
087: this .table = tbl;
088: }
089:
090: /**
091: * Creates a new instance of SQLJoinTableImpl
092: *
093: * @param src SQLJoinTable from which to copy attributes, etc.
094: * @throws BaseException if error occurs while copying from src
095: */
096: public SQLJoinTableImpl(SQLJoinTable src) throws BaseException {
097: this ();
098:
099: if (src == null) {
100: throw new IllegalArgumentException(
101: "Must supply non-null SQLJoinTable instance for src param.");
102: }
103:
104: try {
105: copyFrom(src);
106: } catch (Exception ex) {
107: throw new BaseException(
108: "can not create SQLJoinTableImpl using copy constructor",
109: ex);
110: }
111: }
112:
113: /**
114: * Overrides default implementation.
115: *
116: * @return cloned instance of this object
117: * @throws CloneNotSupportedException if this cannot be cloned.
118: */
119: public Object clone() throws CloneNotSupportedException {
120: SQLJoinTable cond = null;
121: try {
122: cond = new SQLJoinTableImpl(this );
123: } catch (Exception ex) {
124: mLogger.errorNoloc(mLoc.t(
125: "PRSR118: can not create clone of{0}", this
126: .toString()), ex);
127: throw new CloneNotSupportedException(
128: "can not create clone of " + this .toString());
129: }
130: return cond;
131: }
132:
133: /**
134: * All SQL objects are cloneable.
135: *
136: * @return cloned instance of this object
137: * @throws CloneNotSupportedException if this cannot be cloned.
138: */
139: public Object cloneSQLObject() throws CloneNotSupportedException {
140: return this .clone();
141: }
142:
143: /**
144: * Gets display name of this object.
145: *
146: * @return String representing display name.
147: */
148: public String getDisplayName() {
149: return table.getDisplayName();
150: }
151:
152: /**
153: * Gets GUI-related attributes for this instance in the form of a GuiInfo instance.
154: *
155: * @return associated GuiInfo instance
156: * @see GUIInfo
157: */
158: public GUIInfo getGUIInfo() {
159: return this .guiInfo;
160: }
161:
162: /**
163: * Gets name of this object.
164: *
165: * @return String representing object name.
166: */
167: public String getName() {
168: return table.getName();
169: }
170:
171: /**
172: * Gets source table associated with this instance.
173: *
174: * @return SourceTable to associate with this instance.
175: */
176: public SourceTable getSourceTable() {
177: return table;
178: }
179:
180: /**
181: * Populates the member variables and collections of this SQLObject instance, parsing
182: * the given DOM Element as the source for reconstituting its contents.
183: *
184: * @param columnElement DOM element containing XML marshalled version of this
185: * SQLObject instance
186: * @throws BaseException if element is null or error occurs during parsing
187: */
188: public void parseXML(Element xmlElement) throws BaseException {
189: super .parseXML(xmlElement);
190:
191: NodeList childNodeList = xmlElement.getChildNodes();
192: if (childNodeList != null && childNodeList.getLength() != 0) {
193: for (int i = 0; i < childNodeList.getLength(); i++) {
194: if (childNodeList.item(i).getNodeType() == Node.ELEMENT_NODE) {
195: Element childElement = (Element) childNodeList
196: .item(i);
197: String tagName = childElement.getTagName();
198:
199: if (TagParserUtility.TAG_OBJECTREF.equals(tagName)) {
200: secondPassParse(childElement);
201: } else if (GUIInfo.TAG_GUIINFO.equals(tagName)) {
202: this .guiInfo = new GUIInfo(childElement);
203: }
204: }
205: }
206: }
207: }
208:
209: /**
210: * Parses elements which require a second round of parsing to resolve their
211: * references.
212: *
213: * @param element DOM element containing XML marshalled version of this SQLObject
214: * instance
215: * @throws BaseException if element is null or error occurs during parsing
216: */
217: public void secondPassParse(Element element) throws BaseException {
218: SQLJoinView jView = (SQLJoinView) this .getParentObject();
219: SQLDefinition definition = TagParserUtility
220: .getAncestralSQLDefinition(jView);
221:
222: SQLObject obj = TagParserUtility.parseXMLObjectRefTag(
223: definition, element);
224:
225: // If obj is null it may not be parsed yet so do a second parse...
226: // it registers this TargetColumn instance to be parsed a second time
227: // to resolve the value reference
228: if (obj == null) {
229: definition.addSecondPassSQLObject(this , element);
230: } else {
231: setSourceTable((SourceTable) obj);
232: }
233: }
234:
235: /**
236: * Sets source table for this object to the given instance.
237: *
238: * @param sTable SourceTable to associate with this instance
239: */
240: public void setSourceTable(SourceTable sTable) {
241: this .table = sTable;
242: }
243:
244: /**
245: * Generates XML document representing this object's content, using the given String
246: * as a prefix for each line.
247: *
248: * @param prefix String to be prepended to each line of the generated XML document
249: * @return String containing XML representation
250: * @exception BaseException - exception
251: * @see SQLObject#toXMLString(java.lang.String)
252: */
253: public String toXMLString(String prefix) throws BaseException {
254: StringBuilder buffer = new StringBuilder(500);
255: if (prefix == null) {
256: prefix = "";
257: }
258:
259: final String childPrefix = prefix + "\t";
260:
261: buffer.append(prefix).append(getHeader());
262: buffer.append(toXMLAttributeTags(prefix));
263: buffer.append(TagParserUtility.toXMLObjectRefTag(this
264: .getSourceTable(), childPrefix));
265:
266: buffer.append(this .guiInfo.toXMLString(childPrefix));
267: buffer.append(prefix).append(getFooter());
268:
269: return buffer.toString();
270: }
271:
272: private void copyFrom(SQLJoinTable src) throws BaseException {
273: super .copyFromSource(src);
274:
275: // copy gui info
276: GUIInfo gInfo = src.getGUIInfo();
277: this .guiInfo = gInfo != null ? (GUIInfo) gInfo.clone() : null;
278:
279: // copy source table as it no cloning as it is referenced object
280: this.table = src.getSourceTable();
281: }
282: }
|