blob: 8d22fd9de763d1f1a15416671e8142784bc34dd7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.db.internal;
import java.text.Collator;
import java.util.Iterator;
import java.util.List;
import org.eclipse.datatools.connectivity.sqm.core.rte.ICatalogObject;
import org.eclipse.jpt.db.Schema;
import org.eclipse.jpt.db.Sequence;
import org.eclipse.jpt.db.Table;
import org.eclipse.jpt.utility.internal.StringTools;
import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
/**
* Wrap a DTP Schema
*/
final class DTPSchemaWrapper
extends DTPWrapper
implements Schema
{
// backpointer to parent
private final DTPSchemaContainerWrapper container;
// the wrapped DTP schema
private final org.eclipse.datatools.modelbase.sql.schema.Schema dtpSchema;
// lazy-initialized
private DTPTableWrapper[] tables;
// lazy-initialized
private DTPSequenceWrapper[] sequences;
// ********** constructor **********
DTPSchemaWrapper(DTPSchemaContainerWrapper container, org.eclipse.datatools.modelbase.sql.schema.Schema dtpSchema) {
super(container);
this.container = container;
this.dtpSchema = dtpSchema;
}
// ********** DTPWrapper implementation **********
@Override
ICatalogObject getCatalogObject() {
return (ICatalogObject) this.dtpSchema;
}
@Override
synchronized void catalogObjectChanged(int eventType) {
// clear stuff so it can be rebuilt
this.dispose_();
this.getConnectionProfile().schemaChanged(this, eventType);
}
// ********** Schema implementation **********
@Override
public String getName() {
return this.dtpSchema.getName();
}
// ***** tables
public Iterator<Table> tables() {
return new ArrayIterator<Table>(this.tables_());
}
private Iterator<DTPTableWrapper> tableWrappers() {
return new ArrayIterator<DTPTableWrapper>(this.tables_());
}
private synchronized DTPTableWrapper[] tables_() {
if (this.tables == null) {
this.tables = this.buildTables();
}
return this.tables;
}
private DTPTableWrapper[] buildTables() {
List<org.eclipse.datatools.modelbase.sql.tables.Table> dtpTables = this.dtpTables();
DTPTableWrapper[] result = new DTPTableWrapper[dtpTables.size()];
for (int i = result.length; i-- > 0;) {
result[i] = new DTPTableWrapper(this, dtpTables.get(i));
}
return result;
}
// minimize scope of suppressed warnings
@SuppressWarnings("unchecked")
private List<org.eclipse.datatools.modelbase.sql.tables.Table> dtpTables() {
return this.dtpSchema.getTables();
}
public int tablesSize() {
return this.tables_().length;
}
public Iterator<String> tableNames() {
return new TransformationIterator<DTPTableWrapper, String>(this.tableWrappers()) {
@Override
protected String transform(DTPTableWrapper table) {
return table.getName();
}
};
}
public boolean containsTableNamed(String name) {
return this.tableNamed(name) != null;
}
public DTPTableWrapper tableNamed(String name) {
return this.isCaseSensitive() ? this.tableNamedCaseSensitive(name) : this.tableNamedIgnoreCase(name);
}
private DTPTableWrapper tableNamedCaseSensitive(String name) {
for (Iterator<DTPTableWrapper> stream = this.tableWrappers(); stream.hasNext(); ) {
DTPTableWrapper table = stream.next();
if (table.getName().equals(name)) {
return table;
}
}
return null;
}
private DTPTableWrapper tableNamedIgnoreCase(String name) {
for (Iterator<DTPTableWrapper> stream = this.tableWrappers(); stream.hasNext(); ) {
DTPTableWrapper table = stream.next();
if (StringTools.stringsAreEqualIgnoreCase(table.getName(), name)) {
return table;
}
}
return null;
}
/**
* return the table for the specified DTP table
*/
DTPTableWrapper table(org.eclipse.datatools.modelbase.sql.tables.Table dtpTable) {
if (dtpTable.getSchema() != this.dtpSchema) {
return this.database().table(dtpTable);
}
for (Iterator<DTPTableWrapper> stream = this.tableWrappers(); stream.hasNext(); ) {
DTPTableWrapper table = stream.next();
if (table.wraps(dtpTable)) {
return table;
}
}
throw new IllegalArgumentException("invalid DTP table: " + dtpTable); //$NON-NLS-1$
}
// ***** sequences
public Iterator<Sequence> sequences() {
return new ArrayIterator<Sequence>(this.sequences_());
}
private Iterator<DTPSequenceWrapper> sequenceWrappers() {
return new ArrayIterator<DTPSequenceWrapper>(this.sequences_());
}
private synchronized DTPSequenceWrapper[] sequences_() {
if (this.sequences == null) {
this.sequences = this.buildSequences();
}
return this.sequences;
}
private DTPSequenceWrapper[] buildSequences() {
List<org.eclipse.datatools.modelbase.sql.schema.Sequence> dtpSequences = this.dtpSequences();
DTPSequenceWrapper[] result = new DTPSequenceWrapper[dtpSequences.size()];
for (int i = result.length; i-- > 0;) {
result[i] = new DTPSequenceWrapper(this, dtpSequences.get(i));
}
return result;
}
// minimize scope of suppressed warnings
@SuppressWarnings("unchecked")
private List<org.eclipse.datatools.modelbase.sql.schema.Sequence> dtpSequences() {
return this.dtpSchema.getSequences();
}
public int sequencesSize() {
return this.sequences_().length;
}
public Iterator<String> sequenceNames() {
return new TransformationIterator<DTPSequenceWrapper, String>(this.sequenceWrappers()) {
@Override
protected String transform(DTPSequenceWrapper sequence) {
return sequence.getName();
}
};
}
public boolean containsSequenceNamed(String name) {
return this.sequenceNamed(name) != null;
}
public DTPSequenceWrapper sequenceNamed(String name) {
return this.isCaseSensitive() ? this.sequenceNamedCaseSensitive(name) : this.sequenceNamedIgnoreCase(name);
}
private DTPSequenceWrapper sequenceNamedCaseSensitive(String name) {
for (Iterator<DTPSequenceWrapper> stream = this.sequenceWrappers(); stream.hasNext(); ) {
DTPSequenceWrapper sequence = stream.next();
if (sequence.getName().equals(name)) {
return sequence;
}
}
return null;
}
private DTPSequenceWrapper sequenceNamedIgnoreCase(String name) {
for (Iterator<DTPSequenceWrapper> stream = this.sequenceWrappers(); stream.hasNext(); ) {
DTPSequenceWrapper sequence = stream.next();
if (sequence.getName().equalsIgnoreCase(name)) {
return sequence;
}
}
return null;
}
// ********** Comparable implementation **********
public int compareTo(Schema schema) {
return Collator.getInstance().compare(this.getName(), schema.getName());
}
// ********** internal methods **********
boolean wraps(org.eclipse.datatools.modelbase.sql.schema.Schema schema) {
return this.dtpSchema == schema;
}
boolean isCaseSensitive() {
return this.database().isCaseSensitive();
}
DTPColumnWrapper column(org.eclipse.datatools.modelbase.sql.tables.Column dtpColumn) {
return this.database().column(dtpColumn);
}
DTPDatabaseWrapper database() {
return this.container.database();
}
// ********** disposal **********
@Override
synchronized void dispose() {
this.dispose_();
super.dispose();
}
private void dispose_() {
this.disposeSequences();
this.disposeTables();
}
private void disposeSequences() {
if (this.sequences != null) {
for (DTPSequenceWrapper sequence : this.sequences) {
sequence.dispose();
}
this.sequences = null;
}
}
private void disposeTables() {
if (this.tables != null) {
for (DTPTableWrapper table : this.tables) {
table.dispose();
}
this.tables = null;
}
}
}