/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.esl.sql.model;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Database
{
private static final Logger LOG = LoggerFactory.getLogger( Database.class.getName() );
private final List<Table> tables = new LinkedList<Table>();
private final List<View> views = new LinkedList<View>();
private final String name;
private final HashMap<String, Table> columnTableMap = new HashMap<String, Table>();
private final int version;
private final List<String> statements = new LinkedList<String>();
public Database( String databaseName, int version )
{
this.name = databaseName;
this.version = version;
}
public List<String> getStatements()
{
return Collections.unmodifiableList( this.statements );
}
public void addTable( Table table )
{
tables.add( table );
Column[] columns = table.getColumns();
for ( int i = 0; i < columns.length; i++ )
{
columnTableMap.put( columns[i].getName().toLowerCase(), table );
}
}
public void addView( View view )
{
views.add( view );
Column[] columns = view.getColumns();
for ( int i = 0; i < columns.length; i++ )
{
columnTableMap.put( columns[i].getName().toLowerCase(), view );
}
}
public void addStatement( String statement )
{
if ( ( statement != null ) && !statement.trim().equals( "" ) )
{
this.statements.add( statement );
}
}
/*
* This method MUST be called after columns have been added
*/
public void setDatabaseMappings()
{
// Set all foreign key mappings
for ( int i = 0; i < tables.size(); i++ )
{
Table table = tables.get( i );
// Traverse all foreign keys
Column[] columns = table.getColumns();
for ( int j = 0; j < columns.length; j++ )
{
Column column = columns[j];
// set foreign key mappings
if ( column.isForeignKey() )
{
ForeignKeyColumn fk = (ForeignKeyColumn) column;
Table referencedTable = getTable( fk.getReferencedTableName() );
if ( referencedTable != null )
{
Column referencedColumn = referencedTable.getColumn( fk.getReferencedColumnName() );
fk.setReferencedTable( referencedTable );
fk.setReferencedColumn( referencedColumn );
referencedTable.setReference( fk );
}
else
{
LOG.info( "skipping FK: {}.{}, couldn't find referenced table {}",
new Object[]{table, fk, fk.getReferencedTableName()} );
}
}
}
}
}
public Table getTable( String tableName )
{
Table table = null;
for ( int i = 0; i < tables.size(); i++ )
{
if ( tableName.equalsIgnoreCase( tables.get( i ).getName() ) )
{
table = tables.get( i );
}
}
if ( table == null )
{
LOG.info( "Database.getTable(String): table {} does not exist", tableName );
}
return table;
}
public View getView( String viewName )
{
View view = null;
for ( int i = 0; i < views.size(); i++ )
{
if ( viewName.equalsIgnoreCase( views.get( i ).getName() ) )
{
view = views.get( i );
}
}
if ( view == null )
{
LOG.info( "Database.getView(String): view {} does not exist ", viewName );
}
return view;
}
public Table getTableByColumnName( String columnName )
{
return columnTableMap.get( columnName.toLowerCase() );
}
public String getName()
{
return name;
}
public Table[] getTables()
{
Table[] tableArray = new Table[tables.size()];
int i = 0;
Iterator<Table> iter = tables.iterator();
while ( iter.hasNext() )
{
tableArray[i++] = iter.next();
}
return tableArray;
}
public View[] getViews()
{
View[] viewArray = new View[views.size()];
for ( int i = 0; i < views.size(); i++ )
{
viewArray[i] = views.get( i );
}
return viewArray;
}
/**
* Return the model version.
*/
public int getVersion()
{
return this.version;
}
}