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;
043:
044: /** Describes a key in a table.
045: */
046: public abstract class KeyElement extends DBMemberElement implements
047: ColumnElementHolder {
048: /** Creates a new key element represented in memory.
049: */
050: public KeyElement() {
051: this (new Memory(), null);
052: }
053:
054: /** Creates a new key element.
055: * @param impl the pluggable implementation
056: * @param declaringTable declaring table of this key, or
057: * <code>null</code>
058: */
059: public KeyElement(KeyElement.Impl impl, TableElement declaringTable) {
060: super (impl, declaringTable);
061: }
062:
063: /** Returns the implementation for the key element.
064: * @return implementation for the key element
065: */
066: final Impl getKeyImpl() {
067: return (Impl) getElementImpl();
068: }
069:
070: //================== Columns ===============================
071:
072: /** Adds a new column to the key.
073: * @param el the column to add
074: * @throws DBException if impossible
075: */
076: public void addColumn(ColumnElement el) throws DBException {
077: addColumns(new ColumnElement[] { el });
078: }
079:
080: /** Adds some new columns to the key.
081: * @param els the columns to add
082: * @throws DBException if impossible
083: */
084: public void addColumns(final ColumnElement[] els)
085: throws DBException {
086: for (int i = 0; i < els.length; i++)
087: if (getColumn(els[i].getName()) != null)
088: throwAddException("FMT_EXC_AddColumn", els[i]); //NOI18N
089:
090: getKeyImpl().changeColumns(els, TableElement.Impl.ADD);
091: }
092:
093: /** Removes a column from the key.
094: * @param el the column to remove
095: * @throws DBException if impossible
096: */
097: public void removeColumn(ColumnElement el) throws DBException {
098: removeColumns(new ColumnElement[] { el });
099: }
100:
101: /** Removes some columns from the key.
102: * @param els the columns to remove
103: * @throws DBException if impossible
104: */
105: public void removeColumns(final ColumnElement[] els)
106: throws DBException {
107: getKeyImpl().changeColumns(els, TableElement.Impl.REMOVE);
108: }
109:
110: /** Sets the columns for this key.
111: * Previous columns are removed.
112: * @param els the new columns
113: * @throws DBException if impossible
114: */
115: public void setColumns(ColumnElement[] els) throws DBException {
116: getKeyImpl().changeColumns(els, TableElement.Impl.SET);
117: }
118:
119: /** Gets all columns in this key.
120: * @return the columns
121: */
122: public ColumnElement[] getColumns() {
123: return getKeyImpl().getColumns();
124: }
125:
126: /** Finds a column by name.
127: * @param name the name of the column for which to look
128: * @return the element or <code>null</code> if not found
129: */
130: public ColumnElement getColumn(DBIdentifier name) {
131: return getKeyImpl().getColumn(name);
132: }
133:
134: /** This method just throws localized exception. It is used during
135: * adding class element, which already exists in source.
136: * @param formatKey The message format key to localized bundle.
137: * @param element The element which can't be added
138: * @exception DBException is alway thrown from this method.
139: */
140: private void throwAddException(String formatKey,
141: ColumnElement element) throws DBException {
142: //MessageFormat format = new MessageFormat(ElementFormat.bundle.getString(formatKey));
143: String msg = /*format.format(new Object[] { */element
144: .getName().getName();// });
145: throw new DBException(msg);
146: }
147:
148: /** Implementation of an key element.
149: * @see KeyElement
150: */
151: public interface Impl extends DBMemberElement.Impl {
152: /** Changes the set of columns.
153: * @param elems the columns to change
154: * @param action one of {@link #ADD}, {@link #REMOVE}, or {@link #SET}
155: * @exception DBException if the action cannot be handled
156: */
157: public void changeColumns(ColumnElement[] elems, int action)
158: throws DBException;
159:
160: /** Gets all columns.
161: * @return the columns
162: */
163: public ColumnElement[] getColumns();
164:
165: /** Finds a column by name.
166: * @param name the name for which to look
167: * @return the column, or <code>null</code> if it does not exist
168: */
169: public ColumnElement getColumn(DBIdentifier name);
170: }
171:
172: static class Memory extends DBMemberElement.Memory implements Impl {
173: /** collection of columns */
174: private DBMemoryCollection.Column columns;
175:
176: /** Default constructor
177: */
178: Memory() {
179: }
180:
181: /** Copy constructor.
182: * @param column the object from which to read values
183: */
184: Memory(KeyElement key) {
185: super (key);
186: }
187:
188: /** Changes set of elements.
189: * @param elems elements to change
190: * @exception SourceException if the action cannot be handled
191: */
192: public synchronized void changeColumns(ColumnElement[] elems,
193: int action) {
194: initColumns();
195: columns.change(elems, action);
196: }
197:
198: /** Gets all columns.
199: * @return the columns
200: */
201: public synchronized ColumnElement[] getColumns() {
202: initColumns();
203: return (ColumnElement[]) columns.getElements();
204: }
205:
206: /** Finds a column with given name.
207: * @param name the name of column for which to look
208: * @return the element or null if column with such name does not exist
209: */
210: public synchronized ColumnElement getColumn(DBIdentifier name) {
211: initColumns();
212: return (ColumnElement) columns.getElement(name);
213: }
214:
215: /** Initializes the collection of columns.
216: */
217: void initColumns() {
218: if (columns == null)
219: columns = new DBMemoryCollection.Column(this);
220: }
221: }
222: }
|