/*
* Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
* 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.internal.db.ddl;
import org.eclipse.net4j.db.DBException;
import org.eclipse.net4j.db.IDBAdapter;
import org.eclipse.net4j.db.IDBConnectionProvider;
import org.eclipse.net4j.db.ddl.IDBField;
import org.eclipse.net4j.db.ddl.IDBIndex.Type;
import org.eclipse.net4j.db.ddl.IDBSchema;
import org.eclipse.net4j.db.ddl.IDBSchemaElement;
import org.eclipse.net4j.db.ddl.IDBTable;
import org.eclipse.net4j.db.ddl.SchemaElementNotFoundException;
import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta;
import org.eclipse.net4j.spi.db.ddl.InternalDBSchema;
import javax.sql.DataSource;
import java.io.PrintStream;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
/**
* @author Eike Stepper
*/
public final class DelegatingDBSchema extends DelegatingDBSchemaElement implements InternalDBSchema
{
DelegatingDBSchema(InternalDBSchema delegate)
{
super(delegate);
}
@Override
public InternalDBSchema getDelegate()
{
return (InternalDBSchema)super.getDelegate();
}
@Override
public void setDelegate(IDBSchemaElement delegate)
{
IDBTable[] wrapperTables = getTables();
IDBSchema delegateSchema = (IDBSchema)delegate;
super.setDelegate(delegateSchema);
for (IDBTable wrapperTable : wrapperTables)
{
((DelegatingDBSchemaElement)wrapperTable).setDelegate(delegateSchema.getTable(wrapperTable.getName()));
}
}
public IDBSchema getWrapper()
{
return this;
}
@Override
public IDBSchemaElement getParent()
{
return wrap(getDelegate().getParent());
}
public IDBTable addTable(String name)
{
return wrap(getDelegate().addTable(name));
}
public IDBTable removeTable(String name)
{
return wrap(getDelegate().removeTable(name));
}
public String createIndexName(IDBTable table, Type type, IDBField[] fields, int position)
{
return getDelegate().createIndexName(unwrap(table), type, fields, position);
}
public boolean isLocked()
{
return getDelegate().isLocked();
}
public boolean lock()
{
return getDelegate().lock();
}
@SuppressWarnings("unchecked")
public <T extends IDBSchemaElement> T findElement(IDBSchemaElement prototype)
{
T unwrapped = (T)unwrap(prototype);
return (T)wrap(getDelegate().findElement(unwrapped));
}
public boolean unlock()
{
return getDelegate().unlock();
}
public void assertUnlocked() throws DBException
{
getDelegate().assertUnlocked();
}
public IDBTable getTableSafe(String name) throws SchemaElementNotFoundException
{
return wrap(getDelegate().getTableSafe(name));
}
public IDBTable getTable(String name)
{
return wrap(getDelegate().getTable(name));
}
public IDBTable[] getTables()
{
IDBTable[] tables = getDelegate().getTables();
IDBTable[] wrappers = new IDBTable[tables.length];
for (int i = 0; i < tables.length; i++)
{
wrappers[i] = wrap(tables[i]);
}
return wrappers;
}
public Set<IDBTable> create(IDBAdapter dbAdapter, Connection connection) throws DBException
{
return wrap(getDelegate().create(dbAdapter, connection));
}
public Set<IDBTable> create(IDBAdapter dbAdapter, DataSource dataSource) throws DBException
{
return wrap(getDelegate().create(dbAdapter, dataSource));
}
public Set<IDBTable> create(IDBAdapter dbAdapter, IDBConnectionProvider connectionProvider) throws DBException
{
return wrap(getDelegate().create(dbAdapter, connectionProvider));
}
public void drop(IDBAdapter dbAdapter, Connection connection) throws DBException
{
getDelegate().drop(dbAdapter, connection);
}
public void drop(IDBAdapter dbAdapter, DataSource dataSource) throws DBException
{
getDelegate().drop(dbAdapter, dataSource);
}
public void drop(IDBAdapter dbAdapter, IDBConnectionProvider connectionProvider) throws DBException
{
getDelegate().drop(dbAdapter, connectionProvider);
}
public void export(Connection connection, PrintStream out) throws DBException
{
getDelegate().export(connection, out);
}
public void export(DataSource dataSource, PrintStream out) throws DBException
{
getDelegate().export(dataSource, out);
}
public void export(IDBConnectionProvider connectionProvider, PrintStream out) throws DBException
{
getDelegate().export(connectionProvider, out);
}
public IDBSchemaDelta compare(IDBSchema oldSchema)
{
return getDelegate().compare(unwrap(oldSchema));
}
private static Set<IDBTable> wrap(Set<IDBTable> tables)
{
return wrap(tables, new HashSet<IDBTable>());
}
}