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-2006 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:
042: package org.netbeans.modules.dbschema.jdbcimpl;
043:
044: import java.sql.*;
045: import java.util.*;
046:
047: import org.netbeans.modules.dbschema.*;
048: import org.netbeans.modules.dbschema.util.*;
049:
050: public class IndexElementImpl extends DBMemberElementImpl implements
051: IndexElement.Impl {
052:
053: private DBElementsCollection columns;
054: private TableElementImpl tei;
055: private boolean _unique;
056:
057: /** Creates new IndexElementImpl */
058: public IndexElementImpl() {
059: this (null, null, false);
060: }
061:
062: public IndexElementImpl(TableElementImpl tei, String name,
063: boolean unique) {
064: super (name);
065: columns = new DBElementsCollection(tei, new ColumnElement[0]);
066:
067: //workaround for bug #4396371
068: //http://andorra.eng:8080/cgi-bin/ws.exe/bugtraq/bug.hts?where=bugid_value%3D4396371
069: Object hc = String.valueOf(columns.hashCode());
070: while (DBElementsCollection.instances.contains(hc)) {
071: columns = new DBElementsCollection(tei,
072: new ColumnElement[0]);
073: hc = String.valueOf(columns.hashCode());
074: }
075: DBElementsCollection.instances.add(hc);
076:
077: this .tei = tei;
078: _unique = unique;
079: }
080:
081: /** Get the unique flag of the index.
082: * @return true if it is a unique index, false otherwise
083: */
084: public boolean isUnique() {
085: return _unique;
086: }
087:
088: /** Set the unique flag of the index.
089: * @param unique the flag
090: * @throws DBException if impossible
091: */
092: public void setUnique(boolean unique) throws DBException {
093: _unique = unique;
094: }
095:
096: /** Change the set of columns.
097: * @param elems the columns to change
098: * @param action one of {@link #ADD}, {@link #REMOVE}, or {@link #SET}
099: * @exception DBException if the action cannot be handled
100: */
101: public void changeColumns(ColumnElement[] elems, int action)
102: throws DBException {
103: columns.changeElements(elems, action);
104: }
105:
106: /** Get all columns.
107: * @return the columns
108: */
109: public ColumnElement[] getColumns() {
110: DBElement[] dbe = columns.getElements();
111: return (ColumnElement[]) Arrays.asList(dbe).toArray(
112: new ColumnElement[dbe.length]);
113: }
114:
115: /** Find a column by name.
116: * @param name the name for which to look
117: * @return the column, or <code>null</code> if it does not exist
118: */
119: public ColumnElement getColumn(DBIdentifier name) {
120: return (ColumnElement) columns.find(name);
121: }
122:
123: protected void initColumns(LinkedList idxs) {
124: LinkedList columnsList = new LinkedList();
125: String name, info;
126: int start, end;
127:
128: try {
129: for (int i = 0; i < idxs.size(); i++) {
130: info = idxs.get(i).toString();
131: start = info.indexOf('.');
132: end = info.lastIndexOf('.');
133:
134: name = info.substring(0, start);
135: if (name.equals(this .getName().getName()))
136: columnsList.add(info.substring(start + 1, end));
137: }
138:
139: for (int i = 0; i < columnsList.size(); i++) {
140: ColumnElement c = ((IndexElement) element)
141: .getDeclaringTable().getColumn(
142: DBIdentifier.create(columnsList.get(i)
143: .toString()));
144: if (c != null)
145: changeColumns(new ColumnElement[] { c },
146: DBElement.Impl.ADD);
147: }
148: } catch (Exception exc) {
149: exc.printStackTrace();
150: }
151: }
152:
153: /** Returns the table collection of this schema element. This method
154: * should only be used internally and for cloning and archiving.
155: * @return the table collection of this schema element
156: */
157: public DBElementsCollection getColumnCollection() {
158: return columns;
159: }
160:
161: /** Set the table collection of this claschemass element to the supplied
162: * collection. This method should only be used internally and for
163: * cloning and archiving.
164: * @param collection the table collection of this schema element
165: */
166: public void setColumnCollection(DBElementsCollection collection) {
167: columns = collection;
168: }
169:
170: }
|