blob: 3f832f2a82cef472cc531f861795beed53524a36 [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.util.Iterator;
import java.util.List;
import org.eclipse.jpt.db.Schema;
import org.eclipse.jpt.db.SchemaContainer;
import org.eclipse.jpt.utility.internal.StringTools;
import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
/**
* Coalesce behavior for a schema container (i.e. database or catalog).
*/
abstract class DTPSchemaContainerWrapper
extends DTPWrapper
implements SchemaContainer
{
// lazy-initialized
private DTPSchemaWrapper[] schemata;
// ********** constructor **********
DTPSchemaContainerWrapper(ConnectionProfileHolder connectionProfileHolder) {
super(connectionProfileHolder);
}
// ********** DTPWrapper implementation **********
@Override
synchronized void catalogObjectChanged(int eventType) {
// clear stuff so it will be rebuilt
this.dispose_();
}
// ********** abstract methods **********
abstract DTPDatabaseWrapper database();
abstract boolean isCaseSensitive();
abstract List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata();
// ********** schemata **********
public Iterator<Schema> schemata() {
return new ArrayIterator<Schema>(this.schemata_());
}
private Iterator<DTPSchemaWrapper> schemaWrappers() {
return new ArrayIterator<DTPSchemaWrapper>(this.schemata_());
}
synchronized DTPSchemaWrapper[] schemata_() {
if (this.schemata == null) {
this.schemata = this.buildSchemata();
}
return this.schemata;
}
private DTPSchemaWrapper[] buildSchemata() {
List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata = this.dtpSchemata();
DTPSchemaWrapper[] result = new DTPSchemaWrapper[dtpSchemata.size()];
for (int i = result.length; i-- > 0;) {
result[i] = new DTPSchemaWrapper(this, dtpSchemata.get(i));
}
return result;
}
public int schemataSize() {
return this.schemata_().length;
}
public Iterator<String> schemaNames() {
return new TransformationIterator<DTPSchemaWrapper, String>(this.schemaWrappers()) {
@Override
protected String transform(DTPSchemaWrapper schema) {
return schema.getName();
}
};
}
public boolean containsSchemaNamed(String name) {
return this.schemaNamed(name) != null;
}
public DTPSchemaWrapper schemaNamed(String name) {
return this.isCaseSensitive() ? this.schemaNamedCaseSensitive(name) : this.schemaNamedIgnoreCase(name);
}
private DTPSchemaWrapper schemaNamedCaseSensitive(String name) {
for (Iterator<DTPSchemaWrapper> stream = this.schemaWrappers(); stream.hasNext(); ) {
DTPSchemaWrapper schema = stream.next();
if (schema.getName().equals(name)) {
return schema;
}
}
return null;
}
private DTPSchemaWrapper schemaNamedIgnoreCase(String name) {
for (Iterator<DTPSchemaWrapper> stream = this.schemaWrappers(); stream.hasNext(); ) {
DTPSchemaWrapper schema = stream.next();
if (StringTools.stringsAreEqualIgnoreCase(schema.getName(), name)) {
return schema;
}
}
return null;
}
/**
* return the schema for the specified DTP schema
*/
DTPSchemaWrapper schema(org.eclipse.datatools.modelbase.sql.schema.Schema dtpSchema) {
for (Iterator<DTPSchemaWrapper> stream = this.schemaWrappers(); stream.hasNext(); ) {
DTPSchemaWrapper schema = stream.next();
if (schema.wraps(dtpSchema)) {
return schema;
}
}
throw new IllegalArgumentException("invalid DTP schema: " + dtpSchema); //$NON-NLS-1$
}
// ********** disposal **********
@Override
synchronized void dispose() {
this.dispose_();
super.dispose();
}
void dispose_() {
this.disposeSchemata();
}
private void disposeSchemata() {
if (this.schemata != null) {
for (DTPSchemaWrapper schema : this.schemata) {
schema.dispose();
}
this.schemata = null;
}
}
}