/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.store;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import com.enonic.esl.sql.model.Database;
import com.enonic.esl.sql.model.DatabaseXMLFactory;
import com.enonic.vertical.engine.dbmodel.VerticalDatabase;
/**
* This class accesses the database meta data and stores it.
*/
public final class DatabaseAccessor
{
private final static String DATABASE_XML_FILE = "com/enonic/cms/store/database{0,number,0000}.xml";
private static final int firstModelNumber = 201;
// NOTE: Must reflect the latest database.xml file
private final static int latestModelNumber = VerticalDatabase.getInstance().getVersion();
private static Map<Integer, Database> cache = new HashMap<Integer, Database>();
public static Database getLatestDatabase()
{
return doGetDatabase( latestModelNumber );
}
public static Database getDatabase( int modelNumber )
{
if ( modelNumber < firstModelNumber )
{
modelNumber = firstModelNumber;
}
return doGetDatabase( modelNumber );
}
private static Database doGetDatabase( int modelNumber )
{
if ( cache.containsKey( modelNumber ) )
{
return cache.get( modelNumber );
}
String modelDefinition = MessageFormat.format( DATABASE_XML_FILE, modelNumber );
Database database = loadDatabase( modelDefinition );
if ( database.getVersion() != modelNumber )
{
throw new RuntimeException(
"Invalid database definition (" + modelDefinition + "). Unexpected model number found: " + database.getVersion() +
", expected: " + modelNumber );
}
cache.put( modelNumber, database );
return database;
}
private static ClassLoader getClassLoader()
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if ( loader == null )
{
loader = DatabaseAccessor.class.getClassLoader();
}
return loader;
}
private static Database loadDatabase( String modelDefinition )
{
try
{
InputStream in = getClassLoader().getResourceAsStream( modelDefinition );
return DatabaseXMLFactory.generateDatabase( in );
}
catch ( Exception e )
{
throw new RuntimeException( "Failed to load database " + modelDefinition, e );
}
}
}