#*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *#
package $basePackageName;

#if($nestTables == true || $nestViews == true)
import org.apache.empire.data.DataType;
#end
#if($nestViews == true)
import org.apache.empire.db.DBCommandExpr;
#end
import org.apache.empire.db.DBDatabase;
#if($preserveRelationNames == true)
import org.apache.empire.db.DBRelation;
#end
#if($nestTables==true && $baseTableClassName.equals('DBTable'))
import org.apache.empire.db.DBTable;
#end
#if($nestTables == true)
import org.apache.empire.db.DBTableColumn;
#end
#if($nestViews==true && $baseViewClassName.equals('DBView'))
import org.apache.empire.db.DBView;
#end
#if($nestViews == true)
import org.apache.empire.exceptions.NotImplementedException;
#end

#if($nestTables==false && !($tablePackageName.equalsIgnoreCase($basePackageName)))
import $tablePackageName.*;
#end
#if($nestViews==false && !($viewPackageName.equalsIgnoreCase($basePackageName)))
import $viewPackageName.*;
#end

public class $dbClassName extends DBDatabase {

	private static $dbClassName instance;
	private static final long serialVersionUID = 1L;

#foreach($table in $database.tables)
	#set($tblClass=$parser.getTableClassName($table.name))
	public final $tblClass $parser.getTableName($table) = new $tblClass(this);
#end

#foreach($view in $database.views)
	#set($viewClass=$parser.getViewClassName($view.name))
	public final $viewClass $parser.getViewName($view) = new $viewClass(this);
#end
	
	/**
	 * Returns the instance of the database.
	 * @return
	 */
	public static $dbClassName get() {
		if (instance == null) {
			instance = new ${dbClassName}();
		}
		return instance;
	}
	
	/**
	 * Default constructor for the $dbClassName.
	 */
	private ${dbClassName}() {

	#if($preserveRelationNames == true)
	// Define foreign key relations
#foreach ($relation in $database.relations)
		addRelation("$relation.name", new DBRelation.DBReference[] {
#foreach ($reference in $relation.references)
#if($foreach.isLast())
        	${parser.getRowsetName($reference.sourceColumn.rowSet)}.${parser.getColumnName($reference.sourceColumn)}.referenceOn(${parser.getRowsetName($reference.targetColumn.rowSet)}.${parser.getColumnName($reference.targetColumn)}) });
#else
        	${parser.getRowsetName($reference.sourceColumn.rowSet)}.${parser.getColumnName($reference.sourceColumn)}.referenceOn(${parser.getRowsetName($reference.targetColumn.rowSet)}.${parser.getColumnName($reference.targetColumn)}),
#end
#end
#end
		// foreign key relations done
	}	
	#else
	// Define foreign key relations
#foreach ($relation in $database.relations)
#if($relation.references.size()==1)
#foreach ($reference in $relation.references)
		addRelation( "$relation.name", ${parser.getRowsetName($reference.sourceColumn.rowSet)}.${parser.getColumnName($reference.sourceColumn)}.referenceOn(${parser.getRowsetName($reference.targetColumn.rowSet)}.${parser.getColumnName($reference.targetColumn)}));
#end
#else
#foreach ($reference in $relation.references)
#if($foreach.isFirst())
		addRelation( "$relation.name", 
					 ${parser.getRowsetName($reference.sourceColumn.rowSet)}.${parser.getColumnName($reference.sourceColumn)}.referenceOn(${parser.getRowsetName($reference.targetColumn.rowSet)}.$parser.getColumnName($reference.targetColumn)),
#else
#if($foreach.isLast())
        	         ${parser.getRowsetName($reference.sourceColumn.rowSet)}.${parser.getColumnName($reference.sourceColumn)}.referenceOn(${parser.getRowsetName($reference.targetColumn.rowSet)}.$parser.getColumnName($reference.targetColumn)));
#else
            	     ${parser.getRowsetName($reference.sourceColumn.rowSet)}.${parser.getColumnName($reference.sourceColumn)}.referenceOn(${parser.getRowsetName($reference.targetColumn.rowSet)}.$parser.getColumnName($reference.targetColumn)),
#end
#end
#end
#end
#end
		// foreign key relations done
	}	
#end
	
	#if($nestTables == true)
		#foreach ($table in $database.tables)
			#if ($templateFolder)
				#parse( "$templateFolder/Table.vm" )
			#else
				#parse( "Table.vm" )
			#end
		#end
	#end

	#if($nestViews == true)
		#foreach ($view in $database.views)
			#if ($templateFolder)
				#parse( "$templateFolder/View.vm" )
			#else
				#parse( "View.vm" )
			#end
		#end
	#end
	
}
