blob: 5efec5b44767bf0e491fb5fd133d5cb016ca02f4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.dbschema;
/** Describes a key in a table.
*/
public abstract class KeyElement extends DBMemberElement implements ColumnElementHolder {
/** Creates a new key element represented in memory.
*/
public KeyElement() {
this(new Memory(), null);
}
/** Creates a new key element.
* @param impl the pluggable implementation
* @param declaringTable declaring table of this key, or
* <code>null</code>
*/
public KeyElement(KeyElement.Impl impl, TableElement declaringTable) {
super(impl, declaringTable);
}
/** Returns the implementation for the key element.
* @return implementation for the key element
*/
final Impl getKeyImpl() {
return (Impl)getElementImpl();
}
//================== Columns ===============================
/** Adds a new column to the key.
* @param el the column to add
* @throws DBException if impossible
*/
public void addColumn(ColumnElement el) throws DBException {
addColumns(new ColumnElement[]{el});
}
/** Adds some new columns to the key.
* @param els the columns to add
* @throws DBException if impossible
*/
public void addColumns(final ColumnElement[] els) throws DBException {
for (int i = 0; i < els.length; i++)
if (getColumn(els[i].getName()) != null)
throwAddException("FMT_EXC_AddColumn", els[i]); //NOI18N
getKeyImpl().changeColumns(els, TableElement.Impl.ADD);
}
/** Removes a column from the key.
* @param el the column to remove
* @throws DBException if impossible
*/
public void removeColumn(ColumnElement el) throws DBException {
removeColumns(new ColumnElement[]{el});
}
/** Removes some columns from the key.
* @param els the columns to remove
* @throws DBException if impossible
*/
public void removeColumns(final ColumnElement[] els) throws DBException {
getKeyImpl().changeColumns(els, TableElement.Impl.REMOVE);
}
/** Sets the columns for this key.
* Previous columns are removed.
* @param els the new columns
* @throws DBException if impossible
*/
public void setColumns(ColumnElement[] els) throws DBException {
getKeyImpl().changeColumns(els, TableElement.Impl.SET);
}
/** Gets all columns in this key.
* @return the columns
*/
public ColumnElement[] getColumns() {
return getKeyImpl().getColumns();
}
/** Finds a column by name.
* @param name the name of the column for which to look
* @return the element or <code>null</code> if not found
*/
public ColumnElement getColumn(DBIdentifier name) {
return getKeyImpl().getColumn(name);
}
/** This method just throws localized exception. It is used during
* adding class element, which already exists in source.
* @param formatKey The message format key to localized bundle.
* @param element The element which can't be added
* @exception DBException is alway thrown from this method.
*/
private void throwAddException(String formatKey, ColumnElement element) throws DBException {
//MessageFormat format = new MessageFormat(ElementFormat.bundle.getString(formatKey));
String msg = /*format.format(new Object[] { */element.getName().getName();// });
throw new DBException(msg);
}
/** Implementation of an key element.
* @see KeyElement
*/
public interface Impl extends DBMemberElement.Impl {
/** Changes the set of columns.
* @param elems the columns to change
* @param action one of {@link #ADD}, {@link #REMOVE}, or {@link #SET}
* @exception DBException if the action cannot be handled
*/
public void changeColumns(ColumnElement[] elems, int action) throws DBException;
/** Gets all columns.
* @return the columns
*/
public ColumnElement[] getColumns();
/** Finds a column by name.
* @param name the name for which to look
* @return the column, or <code>null</code> if it does not exist
*/
public ColumnElement getColumn(DBIdentifier name);
}
static class Memory extends DBMemberElement.Memory implements Impl {
/** collection of columns */
private DBMemoryCollection.Column columns;
/** Default constructor
*/
Memory() {
}
/** Copy constructor.
* @param column the object from which to read values
*/
Memory(KeyElement key) {
super(key);
}
/** Changes set of elements.
* @param elems elements to change
* @exception SourceException if the action cannot be handled
*/
public synchronized void changeColumns(ColumnElement[] elems, int action) {
initColumns();
columns.change(elems, action);
}
/** Gets all columns.
* @return the columns
*/
public synchronized ColumnElement[] getColumns() {
initColumns();
return (ColumnElement[])columns.getElements();
}
/** Finds a column with given name.
* @param name the name of column for which to look
* @return the element or null if column with such name does not exist
*/
public synchronized ColumnElement getColumn(DBIdentifier name) {
initColumns();
return (ColumnElement)columns.getElement(name);
}
/** Initializes the collection of columns.
*/
void initColumns() {
if (columns == null)
columns = new DBMemoryCollection.Column(this);
}
}
}