<?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 -->
		<databaseProvider>hsqldb</databaseProvider>
	</properties>

	<properties-hsqldb>
		<!-- JDBC properties for a HSQLDB Database connection -->
		<!-- Required jar file: hsqldb.jar -->
		<jdbcClass>org.hsqldb.jdbcDriver</jdbcClass>
		<jdbcURL>jdbc:hsqldb:file:hsqldb/sample;shutdown=true</jdbcURL>
		<jdbcUser>sa</jdbcUser>
		<jdbcPwd></jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-hsqldb>

	<properties-mysql>
		<!-- JDBC properties for a MySQL Database connection -->
		<!-- Required jar file: mysql-connector-java-5.1.6-bin.jar -->
		<jdbcClass>com.mysql.jdbc.Driver</jdbcClass>
		<jdbcURL>jdbc:mysql://localhost</jdbcURL>
		<jdbcUser>root</jdbcUser>
		<jdbcPwd>empire-db</jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-mysql>
	
	<properties-postgresql>
		<!-- JDBC properties for a PostreSQL Database connection -->
		<!-- Required jar file: postgresql-8.3-603.jdbc4.jar -->
		<jdbcClass>org.postgresql.Driver</jdbcClass>
		<jdbcURL>jdbc:postgresql://localhost</jdbcURL>
		<jdbcUser>postgres</jdbcUser>
		<jdbcPwd>postgres</jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-postgresql>
	
	<properties-h2>
		<!-- JDBC properties for a H2 Database connection -->
		<!-- Required jar file: h2-1.1.107.jar -->
		<jdbcClass>org.h2.Driver</jdbcClass>
		<jdbcURL>jdbc:h2:h2/DBSAMPLE</jdbcURL>
		<jdbcUser>sa</jdbcUser>
		<jdbcPwd></jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-h2>
	
	<properties-derby>
		<!-- JDBC properties for a Derby Database connection -->
		<!-- Required jar file: derby-10.4.2.0.jar -->
		<jdbcClass>org.apache.derby.jdbc.EmbeddedDriver</jdbcClass>
		<jdbcURL>jdbc:derby:derby/DBSAMPLE;create=true</jdbcURL>
		<jdbcUser></jdbcUser>
		<jdbcPwd></jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-derby>

	<properties-oracle>
		<!-- JDBC properties for an Oracle Database connection -->
		<!-- Required jar file: ojdbc14.jar -->
		<jdbcClass>oracle.jdbc.driver.OracleDriver</jdbcClass>
		<jdbcURL>jdbc:oracle:thin:@192.168.0.2:1521:ora10</jdbcURL>
		<jdbcUser>DBSAMPLE</jdbcUser>
		<jdbcPwd>DBSAMPLE</jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-oracle>

	<properties-sqlserver>
		<!-- JDBC properties for a Microsoft SQL-Server Database connection -->
		<!-- Required jar file: sqljdbc.jar -->
		<jdbcClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbcClass>
		<jdbcURL>jdbc:sqlserver://192.168.0.2:1433</jdbcURL>
		<jdbcUser>sa</jdbcUser>
		<jdbcPwd>empire-db</jdbcPwd>
		<schemaName>DBSAMPLE</schemaName>
	</properties-sqlserver>
	
	<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.xml" additivity="false">
			<level value="info"/>
			<appender-ref ref="default"/>
		</logger>
		
		<logger name="org.apache.empire.commons" additivity="false">
			<level value="warn"/>
			<appender-ref ref="default"/>
		</logger>
	
		<logger name="org.apache.empire.db" additivity="false">
			<level value="warn"/>
			<appender-ref ref="default"/>
		</logger>

		<!-- Set this level to "debug" to log all SQL-Statements -->		
		<logger name="org.apache.empire.db.DBDatabase" additivity="false">
			<level value="debug"/>
			<appender-ref ref="default"/>
		</logger>
		
		<logger name="org.apache.empire.samples.db" additivity="false">
			<level value="debug"/>
			<appender-ref ref="default"/>
		</logger>
	
		<root>
			<priority value="info"/>
			<appender-ref ref="default"/>
		</root>

	</log4j:configuration>
	
</config>
