blob: 863114250a57c74a8e9ec97f77b7eebc40945445 [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;
import java.util.ResourceBundle;
/** Describes an index in a table.
*/
public final class IndexElement extends DBMemberElement implements ColumnElementHolder {
/** Creates a new index element represented in memory.
*/
public IndexElement() {
this(new Memory(), null);
}
/** Creates a new index element.
* @param impl the pluggable implementation
* @param declaringTable declaring table of this index, or
* <code>null</code>
*/
public IndexElement(Impl impl, TableElement declaringTable) {
super(impl, declaringTable);
}
/** Returns the implementation for the index.
* @return implementation for the index
*/
final Impl getIndexImpl() {
return (Impl)getElementImpl();
}
/** Gets the unique flag of the index.
* @return true if it is a unique index, false otherwise
*/
public boolean isUnique() {
return getIndexImpl().isUnique();
}
/** Sets the unique flag of the index.
* @param flag the flag
* @throws DBException if impossible
*/
public void setUnique(boolean flag) throws DBException {
getIndexImpl().setUnique(flag);
}
//================== Columns ===============================
/** Adds a new column to the index.
* @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 index.
* @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
getIndexImpl().changeColumns(els, TableElement.Impl.ADD);
}
/** Removes a column from the index.
* @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 index.
* @param els the columns to remove
* @throws DBException if impossible
*/
public void removeColumns (final ColumnElement[] els) throws DBException {
getIndexImpl().changeColumns(els, TableElement.Impl.REMOVE);
}
/** Sets the columns for this index.
* Previous columns are removed.
* @param els the new columns
* @throws DBException if impossible
*/
public void setColumns (ColumnElement[] els) throws DBException {
if (els == null)
throw new NullPointerException(ResourceBundle.getBundle("org.netbeans.modules.dbschema.resources.Bundle").getString("NulIndexes")); //NOI18N
getIndexImpl().changeColumns(els, TableElement.Impl.SET);
}
/** Gets all columns in this index.
* @return the columns
*/
public ColumnElement[] getColumns () {
return getIndexImpl().getColumns();
}
/** Find 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 getIndexImpl().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 index element.
* @see IndexElement
*/
public interface Impl extends DBMemberElement.Impl {
/** Gets the unique flag of the index.
* @return true if it is a unique index, false otherwise
*/
public boolean isUnique ();
/** Sets the unique flag of the index.
* @param flag the flag
* @throws DBException if impossible
*/
public void setUnique (boolean flag) throws DBException;
/** 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 {
/** Unique flag of index */
private boolean _unique;
/** collection of columns */
private DBMemoryCollection.Column columns;
/** Default constructor
*/
Memory() {
super();
_unique = true;
}
/** Copy constructor.
* @param column the object from which to read values
*/
Memory(IndexElement index) {
super(index);
_unique = index.isUnique();
}
/** Gets the unique flag of the index.
* @return true if it is a unique index, false otherwise
*/
public boolean isUnique() {
return _unique;
}
/** Sets the unique flag of the index.
* @param flag the flag
*/
public void setUnique(boolean flag) {
boolean old = _unique;
_unique = flag;
firePropertyChange(PROP_UNIQUE, Boolean.valueOf(old), Boolean.valueOf(flag));
}
/** Changes the set of elements.
* @param elems elements to change
* @param action the action to do
*/
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);
}
}
}