<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.
-->
<config>

	<properties>
		<!-- provider name must match the property-section containing the connection data -->
		<jdbcClass>org.hsqldb.jdbcDriver</jdbcClass>
		<jdbcURL>jdbc:hsqldb:file:src/test/resources/hsqldb/sample;shutdown=true</jdbcURL>
		<jdbcUser>sa</jdbcUser>
		<jdbcPwd></jdbcPwd>

		<!-- Schema options -->
		<dbCatalog></dbCatalog>
		<dbSchema></dbSchema>
		<dbTablePattern></dbTablePattern>
		<timestampColumn>UPDATE_TIMESTAMP</timestampColumn>
		
		<!-- generation options -->
		<targetFolder>target/generated-sources/java</targetFolder>
		<packageName>org.apache.empire.db.example</packageName>
		<dbClassName>MyDatabase</dbClassName>
		<nestTables>false</nestTables>
		<nestViews>false</nestViews>
		<createRecordProperties>true</createRecordProperties>
		<preserverCharacterCase>false</preserverCharacterCase>
		<preserveRelationNames>false</preserveRelationNames>
		
		<!-- generation options (optional) 
		<tablePackageName></tablePackageName>
		<viewPackageName></viewPackageName>
		<recordPackageName></recordPackageName>
		<tableBaseName>SampleTable</tableBaseName>
		<viewBaseName>SampleView</viewBaseName>
		<recordBaseName>SampleRecord</recordBaseName>
		<tableNamePrefix></tableNamePrefix>
		<tableClassPrefix>T_</tableClassPrefix>
		<tableClassSuffix></tableClassSuffix>
		<viewNamePrefix></viewNamePrefix>
		<viewClassPrefix>V_</viewClassPrefix>
		<viewClassSuffix></viewClassSuffix>
		<columnNamePrefix></columnNamePrefix>
		-->
	</properties>
	
	<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

		<appender name="default" class="org.apache.log4j.ConsoleAppender">
			<!-- layout class="org.apache.log4j.TTCCLayout"/ -->
			<layout class="org.apache.log4j.PatternLayout">
				<!-- param name="ConversionPattern" value="NSB(%c) %-5p %m	at %l%n"/ -->
				<param name="ConversionPattern" value="%-5p [%d{yyyy/MM/dd HH:mm}]: %m		at %l %n"/>
			</layout>
		</appender>
	
		<!-- log detail configuration -->
		<logger name="org.apache.empire.commons" additivity="false">
			<level value="warn"/>
			<appender-ref ref="default"/>
		</logger>
	
		<root>
			<priority value="info"/>
			<appender-ref ref="default"/>
		</root>

	</log4j:configuration>
	
</config>
