Mavenizing of SLF4J, on going work
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..555af6e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,99 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

+

+	<modelVersion>4.0.0</modelVersion>

+

+	<groupId>org.slf4j</groupId>

+	<artifactId>slf4j</artifactId>

+	<version>1.1.0</version>

+	<packaging>pom</packaging>

+	<name>SLF4J</name>

+

+

+	<url>http://www.slf4j.org</url>

+

+	<organization>

+		<name>QOS.ch</name>

+		<url>http://www.qos.ch</url>

+	</organization>

+	<inceptionYear>2005</inceptionYear>

+

+	<modules>

+		<module>slf4j-api</module>

+	</modules>

+

+	<dependencies>

+			<dependency>

+			<groupId>junit</groupId>

+			<artifactId>junit</artifactId>

+			<version>3.8.1</version>

+			<scope>test</scope>

+		</dependency>

+	</dependencies>

+	

+	<dependencyManagement>

+    <dependencies>

+    </dependencies>

+   

+	</dependencyManagement>

+

+	<build>

+

+	</build>

+

+	<reporting>

+		<plugins>

+			<plugin>

+				<groupId>org.apache.maven.plugins</groupId>

+				<artifactId>maven-site-plugin</artifactId>

+			</plugin>

+			<plugin>

+				<groupId>org.apache.maven.plugins</groupId>

+				<artifactId>

+					maven-project-info-reports-plugin

+				</artifactId>

+				<reportSets>

+					<reportSet>

+						<reports>

+						</reports>

+					</reportSet>

+				</reportSets>

+			</plugin>

+	 

+      <plugin>

+      	<groupId>org.apache.maven.plugins</groupId>

+        <artifactId>maven-javadoc-plugin</artifactId>

+        <configuration>

+        	<aggregate>true</aggregate>

+					<links>

+						<link>

+							http://java.sun.com/j2se/1.5.0/docs/api

+						</link>

+					</links>

+				</configuration>

+      </plugin>

+      

+      <plugin>

+				<artifactId>maven-assembly-plugin</artifactId>

+				<version>2.1</version>

+				<configuration>

+					<descriptors>

+						<descriptor>

+							src/main/assembly/source.xml

+						</descriptor>

+					</descriptors>

+					<finalName>

+						logback-${project.version}

+					</finalName>

+					<appendAssemblyId>false</appendAssemblyId>

+					<outputDirectory>target/site/dist/</outputDirectory>

+				</configuration>

+			</plugin>

+			

+    </plugins>

+

+	</reporting>

+	

+

+</project>
\ No newline at end of file
diff --git a/slf4j-api/pom.xml b/slf4j-api/pom.xml
new file mode 100644
index 0000000..a75151f
--- /dev/null
+++ b/slf4j-api/pom.xml
@@ -0,0 +1,78 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

+

+	<parent>

+		<groupId>org.slf4j</groupId>

+		<artifactId>slf4j</artifactId>

+		<version>1.1.0</version>

+	</parent>

+	

+	<modelVersion>4.0.0</modelVersion>

+

+	<groupId>org.slf4j</groupId>

+	<artifactId>slf4j-api</artifactId>

+	<version>${parent.version}</version>

+	<packaging>jar</packaging>

+	<name>SLF4J API Module</name>

+

+	<url>http://www.slf4j.org</url>

+	<description>

+		<!-- 

+			Never _never_ let Eclipse's auto format function add

+			a line return in the description.

+			The generated jar will contain a corrupt MANIFEST file.

+		-->

+		Logback: the generic, reliable, fast and flexible logging library for Java.

+	</description>

+

+	<dependencies>

+	

+	</dependencies>

+

+

+	<build>

+		<plugins>

+			<plugin>

+				<groupId>org.apache.maven.plugins</groupId>

+				<artifactId>maven-compiler-plugin</artifactId>

+				<configuration>

+					<source>1.5</source>

+					<target>1.5</target>

+				</configuration>

+			</plugin>

+

+			<plugin>

+				<groupId>org.apache.maven.plugins</groupId>

+				<artifactId>maven-surefire-plugin</artifactId>

+				<configuration>

+					<forkMode>once</forkMode>

+					<reportFormat>plain</reportFormat>

+					<trimStackTrace>false</trimStackTrace>

+					<excludes>

+						<exclude>**/AllTest.java</exclude>

+						<exclude>**/PackageTest.java</exclude>

+					</excludes>

+				</configuration>

+			</plugin>

+

+			<plugin>

+				<groupId>org.apache.maven.plugins</groupId>

+				<artifactId>maven-jar-plugin</artifactId>

+				<executions>

+					<execution>

+						<id>bundle-test-jar</id>

+						<phase>package</phase>

+						<goals>

+							<goal>jar</goal>

+							<goal>test-jar</goal>

+						</goals>

+					</execution>

+				</executions>

+			</plugin>

+	

+    </plugins>

+

+	</build>

+

+

+

+</project>
\ No newline at end of file
diff --git a/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java
new file mode 100644
index 0000000..0eadac2
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java
@@ -0,0 +1,66 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * 

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j;

+

+

+/**

+ * <code>ILoggerFactory</code> instances manufacture {@link Logger}

+ * instances by name.

+ * 

+ * <p>Most users retrieve {@link Logger} instances through the static

+ * {@link LoggerFactory#getLogger(String)} method. An instance of of this

+ * interface is bound internally with {@link LoggerFactory} class at 

+ * compile time. Only developers of SLF4J conforming logging systems 

+ * need to worry about this interface. 

+ * 

+ * <p>See the section <a href="http://slf4j.org/faq.html#3">Implementing 

+ * the SLF4J API</a> in the FAQ for details on how to make your logging 

+ * system conform to SLF4J.

+ * 

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public interface ILoggerFactory {

+  

+  /**

+   * Return an appropriate {@link Logger} instance as specified by the

+   * <code>name</code> parameter.

+   * 

+   * <p>Null-valued name arguments are considered invalid.

+   *

+   * <p>Certain extremely simple logging systems, e.g. NOP, may always

+   * return the same logger instance regardless of the requested name.

+   * 

+   * @param name the name of the Logger to return

+   */

+  public Logger getLogger(String name);

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/IMarkerFactory.java b/slf4j-api/src/main/java/org/slf4j/IMarkerFactory.java
new file mode 100644
index 0000000..ce2b5cf
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/IMarkerFactory.java
@@ -0,0 +1,68 @@
+/*

+ * Copyright (c) 2004-2005 SLF4J.ORG Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ *

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ *

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j;

+

+

+/**

+ * Implementaitons of this interface are used to manufacture {@link Marker}

+ * instances.

+ * 

+ * <p>See the section <a href="http://slf4j.org/faq.html#3">Implementing 

+ * the SLF4J API</a> in the FAQ for details on how to make your logging 

+ * system conform to SLF4J.

+ * 

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public interface IMarkerFactory {

+

+  /**

+   * Manufacture a {@link Marker} instance by name. If the instance has been 

+   * created earlier, return the previously created instance. 

+   * 

+   * <p>Null name values are not allowed.

+   *

+   * @param name the name of the marker to be created, null value is

+   * not allowed.

+   *

+   * @return a Marker instance

+   */

+  Marker getMarker(String name);

+  

+  /**

+   * Checks if the marker with the name already exists. If name is null, then false 

+   * is returned.

+   * 

+   * @return true id the marker exists, false otherwise. 

+   */

+  boolean exists(String name);

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/Logger.java b/slf4j-api/src/main/java/org/slf4j/Logger.java
new file mode 100644
index 0000000..62dec09
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/Logger.java
@@ -0,0 +1,546 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * 

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j;

+

+/**

+ * 

+ * The main user interface to logging. It is expected that logging

+ * takes place through concrete implementations of this interface.

+ * 

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public interface Logger {

+

+

+  /**

+   * Return the name of this <code>Logger</code> instance.

+   */

+  public String getName();

+

+  /**

+   * Is the logger instance enabled for the DEBUG level?

+   * @return True if this Logger is enabled for the DEBUG level,

+   * false otherwise.

+   */

+  public boolean isDebugEnabled();

+  

+  /**

+   * Log a message at the DEBUG level.

+   *

+   * @param msg the message string to be logged

+   */

+  public void debug(String msg);

+  

+

+  /**

+   * Log a message at the DEBUG level according to the specified format

+   * and argument.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the DEBUG level. </p>

+   *

+   * @param format the format string 

+   * @param arg  the argument

+   */

+  public void debug(String format, Object arg);

+

+

+  

+  /**

+   * Log a message at the DEBUG level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the DEBUG level. </p>

+   *

+   * @param format the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void debug(String format, Object arg1, Object arg2);

+

+  /**

+   * Log a message at the DEBUG level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the DEBUG level. </p>

+   *

+   * @param format the format string

+   * @param argArray an array of arguments

+   */

+  public void debug(String format, Object[] argArray);

+  

+  /**

+   * Log an exception (throwable) at the DEBUG level with an

+   * accompanying message. 

+   * 

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log

+   */ 

+  public void debug(String msg, Throwable t);

+ 

+  

+  /**

+   * Similar to {@link #isDebugEnabled()} method except that the

+   * marker data is also taken into account.

+   * 

+   * @param marker The marker data to take into consideration

+   */

+  public boolean isDebugEnabled(Marker marker);

+  

+  /**

+   * Log a message with the specific Marker at the DEBUG level.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param msg the message string to be logged

+   */

+  public void debug(Marker marker, String msg);

+  

+  /**

+   * This method is similar to {@link #debug(String, Object)} method except that the 

+   * marker data is also taken into consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param format the format string

+   * @param arg the argument

+   */

+  public void debug(Marker marker, String format, Object arg);

+ 

+ 

+  /**

+   * This method is similar to {@link #debug(String, Object, Object)}

+   * method except that the marker data is also taken into

+   * consideration.

+   *

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void debug(Marker marker, String format, Object arg1, Object arg2);

+

+  /**

+   * This method is similar to {@link #debug(String, Object[])}

+   * method except that the marker data is also taken into

+   * consideration.

+   *

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param argArray an array of arguments

+   */

+  public void debug(Marker marker, String format, Object[] argArray);

+

+  

+  /**

+   * This method is similar to {@link #debug(String, Throwable)} method except that the

+   * marker data is also taken into consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log

+   */ 

+  public void debug(Marker marker, String msg, Throwable t);

+  

+  

+  /**

+   * Is the logger instance enabled for the INFO level?

+   * @return True if this Logger is enabled for the INFO level,

+   * false otherwise.

+   */

+  public boolean isInfoEnabled();

+

+  

+  /**

+   * Log a message at the INFO level.

+   *

+   * @param msg the message string to be logged

+   */

+  public void info(String msg);

+  

+

+  /**

+   * Log a message at the INFO level according to the specified format

+   * and argument.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the INFO level. </p>

+   *

+   * @param format the format string 

+   * @param arg  the argument

+   */

+  public void info(String format, Object arg);

+

+  

+  /**

+   * Log a message at the INFO level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the INFO level. </p>

+   *

+   * @param format the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void info(String format, Object arg1, Object arg2);

+

+  /**

+   * Log a message at the INFO level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the INFO level. </p>

+   *

+   * @param format the format string

+   * @param argArray an array of arguments

+   */

+  public void info(String format, Object[] argArray);

+  

+  /**

+   * Log an exception (throwable) at the INFO level with an

+   * accompanying message. 

+   * 

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log 

+   */

+  public void info(String msg, Throwable t);

+

+  /**

+   * Similar to {@link #isInfoEnabled()} method except that the marker

+   * data is also taken into consideration.

+   *

+   * @param marker The marker data to take into consideration

+   */

+  public boolean isInfoEnabled(Marker marker);

+  

+  /**

+   * Log a message with the specific Marker at the INFO level.

+   * 

+   * @param marker The marker specific to this log statement

+   * @param msg the message string to be logged

+   */

+  public void info(Marker marker, String msg);

+  

+  /**

+   * This method is similar to {@link #info(String, Object)} method except that the 

+   * marker data is also taken into consideration.

+   *

+   * @param marker the marker data specific to this log statement

+   * @param format the format string

+   * @param arg the argument

+   */

+  public void info(Marker marker, String format, Object arg);

+  

+  /**

+   * This method is similar to {@link #info(String, Object, Object)}

+   * method except that the marker data is also taken into

+   * consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void info(Marker marker, String format, Object arg1, Object arg2);  

+  

+  

+  /**

+   * This method is similar to {@link #info(String, Object[])}

+   * method except that the marker data is also taken into

+   * consideration.

+   *

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param argArray an array of arguments

+   */

+  public void info(Marker marker, String format, Object[] argArray);

+

+  

+  /**

+   * This method is similar to {@link #info(String, Throwable)} method

+   * except that the marker data is also taken into consideration.

+   * 

+   * @param marker the marker data for this log statement

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log

+   */ 

+  public void info(Marker marker, String msg, Throwable t); 

+

+  

+  /**

+   * Is the logger instance enabled for the WARN level?

+   * @return True if this Logger is enabled for the WARN level,

+   * false otherwise.

+   */

+  public boolean isWarnEnabled();

+

+  /**

+   * Log a message at the WARN level.

+   *

+   * @param msg the message string to be logged

+   */

+  public void warn(String msg);

+

+ /**

+   * Log a message at the WARN level according to the specified format

+   * and argument.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the WARN level. </p>

+   *

+   * @param format the format string 

+   * @param arg  the argument

+   */

+  public void warn(String format, Object arg);

+

+  

+  /**

+   * Log a message at the WARN level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the WARN level. </p>

+   *

+   * @param format the format string

+   * @param argArray an array of arguments

+   */

+  public void warn(String format, Object[] argArray);

+  

+  /**

+   * Log a message at the WARN level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the WARN level. </p>

+   *

+   * @param format the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void warn(String format, Object arg1, Object arg2);

+  

+  /**

+   * Log an exception (throwable) at the WARN level with an

+   * accompanying message. 

+   * 

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log 

+   */

+  public void warn(String msg, Throwable t);

+  

+

+  /**

+   * Similar to {@link #isWarnEnabled()} method except that the marker

+   * data is also taken into consideration.

+   *

+   * @param marker The marker data to take into consideration

+   */

+  public boolean isWarnEnabled(Marker marker);

+ 

+  /**

+   * Log a message with the specific Marker at the WARN level.

+   * 

+   * @param marker The marker specific to this log statement

+   * @param msg the message string to be logged

+   */

+  public void warn(Marker marker, String msg); 

+  

+  /**

+   * This method is similar to {@link #warn(String, Object)} method except that the 

+   * marker data is also taken into consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param format the format string

+   * @param arg the argument

+   */

+  public void warn(Marker marker, String format, Object arg);

+  

+  /**

+   * This method is similar to {@link #warn(String, Object, Object)}

+   * method except that the marker data is also taken into

+   * consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void warn(Marker marker, String format, Object arg1, Object arg2);  

+  

+  /**

+   * This method is similar to {@link #warn(String, Object[])}

+   * method except that the marker data is also taken into

+   * consideration.

+   *

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param argArray an array of arguments

+   */

+  public void warn(Marker marker, String format, Object[] argArray);

+

+  

+  /**

+   * This method is similar to {@link #warn(String, Throwable)} method

+   * except that the marker data is also taken into consideration.

+   * 

+   * @param marker the marker data for this log statement

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log

+   */ 

+  public void warn(Marker marker, String msg, Throwable t); 

+  

+

+  /**

+   * Is the logger instance enabled for the ERROR level?

+   * @return True if this Logger is enabled for the ERROR level,

+   * false otherwise.

+   */

+  public boolean isErrorEnabled();

+  

+  /**

+   * Log a message at the ERROR level.

+   *

+   * @param msg the message string to be logged

+   */

+  public void error(String msg);

+  

+ /**

+   * Log a message at the ERROR level according to the specified format

+   * and argument.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the ERROR level. </p>

+   *

+   * @param format the format string 

+   * @param arg  the argument

+   */

+  public void error(String format, Object arg);

+

+  /**

+   * Log a message at the ERROR level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the ERROR level. </p>

+   *

+   * @param format the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void error(String format, Object arg1, Object arg2);

+

+  /**

+   * Log a message at the ERROR level according to the specified format

+   * and arguments.

+   * 

+   * <p>This form avoids superfluous object creation when the logger

+   * is disabled for the ERROR level. </p>

+   *

+   * @param format the format string

+   * @param argArray an array of arguments

+   */

+  public void error(String format, Object[] argArray);

+  

+  /**

+   * Log an exception (throwable) at the ERROR level with an

+   * accompanying message. 

+   * 

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log

+   */

+  public void error(String msg, Throwable t);

+

+

+  /**

+   * Similar to {@link #isErrorEnabled()} method except that the

+   * marker data is also taken into consideration.

+   *

+   * @param marker The marker data to take into consideration

+   */

+  public boolean isErrorEnabled(Marker marker);

+  

+  /**

+   * Log a message with the specific Marker at the ERROR level.

+   * 

+   * @param marker The marker specific to this log statement

+   * @param msg the message string to be logged

+   */

+  public void error(Marker marker, String msg); 

+  

+  /**

+   * This method is similar to {@link #error(String, Object)} method except that the 

+   * marker data is also taken into consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param format the format string

+   * @param arg the argument

+   */

+  public void error(Marker marker, String format, Object arg);

+  

+  /**

+   * This method is similar to {@link #error(String, Object, Object)}

+   * method except that the marker data is also taken into

+   * consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param arg1  the first argument

+   * @param arg2  the second argument

+   */

+  public void error(Marker marker, String format, Object arg1, Object arg2);  

+  

+  /**

+   * This method is similar to {@link #error(String, Object[])}

+   * method except that the marker data is also taken into

+   * consideration.

+   *

+   * @param marker the marker data specific to this log statement

+   * @param format  the format string

+   * @param argArray an array of arguments

+   */

+  public void error(Marker marker, String format, Object[] argArray);

+

+  

+  /**

+   * This method is similar to {@link #error(String, Throwable)}

+   * method except that the marker data is also taken into

+   * consideration.

+   * 

+   * @param marker the marker data specific to this log statement

+   * @param msg the message accompanying the exception

+   * @param t the exception (throwable) to log

+   */ 

+  public void error(Marker marker, String msg, Throwable t);

+

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/Marker.java b/slf4j-api/src/main/java/org/slf4j/Marker.java
new file mode 100644
index 0000000..99393a6
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/Marker.java
@@ -0,0 +1,120 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j;

+

+import java.util.Iterator;

+

+/**

+ * Markers are named objects used to enrich log statements. Conforming

+ * logging system Implementations of SLF4J determine how information

+ * conveyed by markers are used, if at all. In particular, many

+ * conforming logging systems ignore marker data.

+ * 

+ * <p>Markers can contain child markers, which in turn  can contain children 

+ * of their own.

+ *

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public interface Marker {

+ 

+  /**

+   * This constant represents any marker, including a null marker.

+   */

+  public static final String ANY_MARKER = "*";

+  

+  /**

+   * This constant represents any non-null marker.

+   */

+  public static final String ANY_NON_NULL_MARKER = "+";

+  

+  

+  /**

+   * Get the name of this Marker.

+   * @return name of marker

+   */ 

+  public String getName();

+

+  /**

+   * Add a child Marker to this Marker.

+   * @param child a child marker

+   */

+  public void add(Marker child);

+  

+  /**

+   * Remove a child Marker.

+   * @param child the child Marker to remove

+   * @return true if child could be found and removed, false otherwise.

+   */

+  public boolean remove(Marker child);

+  

+  /**

+   * Does this marker have children?

+   * @return true if this marker has children, false otherwise.

+   */

+  public boolean hasChildren();

+  

+  /**

+   * Returns an Iterator which can be used to iterate over the

+   * children of this marker. An empty iterator is returned when this

+   * marker has no children.

+   * 

+   * @return Iterator over the children of this marker

+   */

+  public Iterator iterator();

+  

+  /**

+   * Does this marker contain the 'other' marker? Marker A is defined to 

+   * contain marker B, if A == B or if B is a child of A. 

+   * 

+   * @param other The marker to test for inclusion.

+   * @throws IllegalArgumentException if 'other' is null

+   * @return Whether this marker contains the other marker.

+   */

+  public boolean contains(Marker other);

+

+  

+  

+  /**

+   * Does this marker contain the marker named 'name'? 

+   * 

+   * If 'name' is null the returned value is always false.

+   * 

+   * @param other The marker to test for inclusion.

+   * @return Whether this marker contains the other marker.

+   */

+  public boolean contains(String name);

+  

+//  void makeImmutable();

+//  public boolean isImmutable();

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/impl/BasicMarker.java b/slf4j-api/src/main/java/org/slf4j/impl/BasicMarker.java
new file mode 100644
index 0000000..fbc1507
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/impl/BasicMarker.java
@@ -0,0 +1,142 @@
+/*

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ *

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ *

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.impl;

+

+import org.slf4j.IMarkerFactory;

+import org.slf4j.Marker;

+

+import java.util.Collections;

+import java.util.Iterator;

+import java.util.List;

+import java.util.Vector;

+

+

+/**

+ * An almost trivial implementation of the {@link Marker} interface. 

+ *

+ * <p><code>BasicMarker</code> lets users specify marker

+ * information. However, it does not offer any useful operations on

+ * that information. 

+ *

+ * <p>Simple logging systems which ignore marker data, just return

+ * instances of this class in order to conform to the SLF4J API.

+ *

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public class BasicMarker implements Marker {

+  final String name;

+  List children;

+  final IMarkerFactory factory;

+  

+  BasicMarker(String name, IMarkerFactory factory) {

+    this.name = name;

+    this.factory = factory;

+  }

+

+  public String getName() {

+    return name;

+  }

+

+  public synchronized void add(Marker child) {

+    if (child == null) {

+      throw new NullPointerException(

+        "Null children cannot be added to a Marker.");

+    }

+    if (children == null) {

+      children = new Vector();

+    }

+    children.add(child);

+  }

+

+  public synchronized boolean hasChildren() {

+    return ((children != null) && (children.size() > 0));

+  }

+

+  public synchronized Iterator iterator() {

+    if (children != null) {

+      return children.iterator();

+    } else {

+      return Collections.EMPTY_LIST.iterator();

+    }

+  }

+

+  public synchronized boolean remove(Marker markerToRemove) {

+    if (children == null) {

+      return false;

+    }

+

+    int size = children.size();

+    for (int i = 0; i < size; i++) {

+      Marker m = (Marker) children.get(i);

+      if( m == markerToRemove) {

+          return false;

+      }

+    }

+    // could not find markerToRemove

+    return false;

+  }

+  

+  public boolean contains(Marker other) {

+    if(other == null) {

+      throw new IllegalArgumentException("Other cannot be null");

+    }

+    

+    if(this == other) {

+      return true;

+    }

+    

+    if (hasChildren()) {

+      for(int i = 0; i < children.size(); i++) {

+        Marker child = (Marker) children.get(i);

+        if(child.contains(other)) {

+          return true;

+        }

+      }

+    }

+    return false;

+  }

+  

+  public boolean contains(String name) {

+    if(name == null) {

+      return false;

+    }

+    if(factory.exists(name)) {

+      Marker other = factory.getMarker(name);

+      return contains(other);     

+    } else {

+      return false;

+    }

+  }

+

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/impl/BasicMarkerFactory.java b/slf4j-api/src/main/java/org/slf4j/impl/BasicMarkerFactory.java
new file mode 100644
index 0000000..d06b92c
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/impl/BasicMarkerFactory.java
@@ -0,0 +1,94 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.impl;

+

+import java.util.HashMap;

+import java.util.Map;

+

+import org.slf4j.IMarkerFactory;

+import org.slf4j.Marker;

+

+/**

+ * An almost trivial implementation of the {@link IMarkerFactory}

+ * interface which creates {@link BasicMarker} instances.

+ * 

+ * <p>Simple logging systems can conform to the SLF4J API by binding

+ * {@link org.slf4j.MarkerFactory} with an instance of this class.

+ *

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public class BasicMarkerFactory implements IMarkerFactory {

+

+  Map markerMap = new HashMap();

+  

+  /**

+   * Regular users should <em>not</em> create

+   * <code>BasicMarkerFactory</code> instances. <code>Marker</code>

+   * instances can be obtained using the static {@link

+   * org.slf4j.MarkerFactory#getMarker} method.

+   */

+  public BasicMarkerFactory() {

+  }

+

+  /**

+   * Manufacture a {@link BasicMarker} instance by name. If the instance has been 

+   * created earlier, return the previously created instance. 

+   * 

+   * @param name the name of the marker to be created

+   * @return a Marker instance

+   */

+  public synchronized Marker getMarker(String name) {

+    if (name == null) {

+      throw new IllegalArgumentException("Marker name cannot be null");

+    }

+

+    Marker marker = (Marker) markerMap.get(name);

+    if (marker == null) {

+      marker = new BasicMarker(name, this);

+      markerMap.put(name, marker);

+    }

+    return marker;

+  }

+  

+  /**

+   * Does the name marked already exist?

+   */

+  public synchronized boolean exists(String name) {

+    if (name == null) {

+      return false;

+    }

+    return markerMap.containsKey(name);

+  }

+  

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/impl/MarkerIgnoringBase.java b/slf4j-api/src/main/java/org/slf4j/impl/MarkerIgnoringBase.java
new file mode 100644
index 0000000..d9b8fff
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/impl/MarkerIgnoringBase.java
@@ -0,0 +1,147 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.impl;

+

+import org.slf4j.Logger;

+import org.slf4j.Marker;

+

+

+/**

+ * This class serves as base for adapters or native implementations of logging systems 

+ * lacking Marker support. In this implementation, methods taking marker data 

+ * simply invoke the corresponding method without the Marker argument, discarding 

+ * any marker data passed as argument.

+ * 

+ * @author Ceki Gulcu

+ */

+public abstract class MarkerIgnoringBase implements Logger {

+

+  public boolean isDebugEnabled(Marker marker) {

+    return isDebugEnabled();

+  }

+

+  public void debug(Marker marker, String msg) {

+    debug(msg);

+  }

+

+  public void debug(Marker marker, String format, Object arg) {

+    debug(format, arg);

+  }

+

+  public void debug(Marker marker, String format, Object arg1, Object arg2) {

+    debug(format, arg1, arg2);

+  }

+

+  public void debug(Marker marker, String format, Object[] argArray) {

+    debug(format, argArray);

+  }

+

+  public void debug(Marker marker, String msg, Throwable t) {

+    debug(msg, t);

+  }

+

+  public boolean isInfoEnabled(Marker marker) {

+    return isInfoEnabled();

+  }

+

+  public void info(Marker marker, String msg) {

+    info(msg);

+  }

+

+  public void info(Marker marker, String format, Object arg) {

+    info(format, arg);

+  }

+

+  public void info(Marker marker, String format, Object arg1, Object arg2) {

+    info(format, arg1, arg2);

+  }

+

+  public void info(Marker marker, String format, Object[] argArray) {

+    info(format, argArray);

+  }

+

+  public void info(Marker marker, String msg, Throwable t) {

+    info(msg, t);

+  }

+

+  public boolean isWarnEnabled(Marker marker) {

+    return isWarnEnabled();

+  }

+

+  public void warn(Marker marker, String msg) {

+    warn(msg);

+  }

+

+  public void warn(Marker marker, String format, Object arg) {

+    warn(format, arg);

+  }

+

+  public void warn(Marker marker, String format, Object arg1, Object arg2) {

+    warn(format, arg1, arg2);

+  }

+

+  public void warn(Marker marker, String format, Object[] argArray) {

+    warn(format, argArray);

+  }

+

+  public void warn(Marker marker, String msg, Throwable t) {

+    warn(msg, t);

+  }

+

+ 

+  public boolean isErrorEnabled(Marker marker) {

+    return isErrorEnabled();

+  }

+

+  public void error(Marker marker, String msg) {

+    error(msg);

+  }

+

+  public void error(Marker marker, String format, Object arg) {

+    error(format, arg);

+  }

+

+  public void error(Marker marker, String format, Object arg1, Object arg2) {

+    error(format, arg1, arg2);

+  }

+

+  public void error(Marker marker, String format, Object[] argArray) {

+    error(format, argArray);

+  }

+

+  public void error(Marker marker, String msg, Throwable t) {

+    error(msg, t);

+  }

+

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/impl/MessageFormatter.java b/slf4j-api/src/main/java/org/slf4j/impl/MessageFormatter.java
new file mode 100644
index 0000000..12a49b8
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/impl/MessageFormatter.java
@@ -0,0 +1,159 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.impl;

+

+

+/**

+  * Formats messages according to very simple substitution rules. Substitutions can be

+  * made 1, 2 or more arguments.

+  * <p>

+  * For example, 

+  * <pre>MessageFormatter.format("Hi {}.", "there");</pre> will

+  * return the string "Hi there.".

+  * <p>

+  * The {} pair is called the <em>formatting anchor</em>. It serves to designate the

+  * location where arguments need to be substituted within the message pattern.

+  * <p>

+  * In the rare case where you need to place the '{' or '}' in the message pattern 

+  * itself but do not want them to be interpreted as a formatting anchors, you can

+  * espace the '{' character with '\', that is the backslash character. Only the

+  * '{' character should be escaped. There is no need to escape the '}' character.  

+  * For example, <pre>MessageFormatter.format("File name is \\{{}}.", "App folder.zip");</pre>

+  * will return the string "File name is {App folder.zip}.". 

+  * 

+  * See {@link #format(String, Object)}, {@link #format(String, Object, Object)} 

+  * and {@link #arrayFormat(String, Object[])} methods for more details.

+  *

+  * @author Ceki G&uuml;lc&uuml;

+  */

+public class MessageFormatter {

+  static final char DELIM_START = '{';

+  static final char DELIM_STOP = '}';

+

+  /**

+   * Performs single argument substitution for the 'messagePattern' passed as

+   * parameter.

+   * <p>

+   * For example, <pre>MessageFormatter.format("Hi {}.", "there");</pre> will

+   * return the string "Hi there.".

+   * <p>

+   * @param messagePattern The message pattern which will be parsed and formatted

+   * @param argument The argument to be substituted in place of the formatting anchor

+   * @return The formatted message

+   */

+  public static String format(String messagePattern, Object arg) {

+    return arrayFormat(messagePattern, new Object[] {arg});   

+   }

+  

+  /**

+   *

+   * Performs a two argument substitution for the 'messagePattern' passed as

+   * parameter.

+   * <p>

+   * For example, 

+   * <pre>MessageFormatter.format("Hi {}. My name is {}.", "Alice", "Bob");</pre> will 

+   * return the string "Hi Alice. My name is Bob.".

+   * 

+   * @param messagePattern The message pattern which will be parsed and formatted

+   * @param arg1 The argument to be substituted in place of the first formatting anchor 

+   * @param arg2 The argument to be substituted in place of the second formatting anchor 

+   * @return The formatted message

+   */

+  public static String format(String messagePattern, Object arg1, Object arg2) {

+   return arrayFormat(messagePattern, new Object[] {arg1, arg2});   

+  }

+  

+  /**

+   * Same principle as the {@link #format(String, Object)} and 

+   * {@link #format(String, Object, Object)} methods except that

+   * any number of arguments can be passed in an array.

+   * 

+   * @param messagePattern The message pattern which will be parsed and formatted

+   * @param argArray An array of arguments to be substituted in place of formatting anchors

+   * @return The formatted message

+   */

+  public static String arrayFormat(String messagePattern, Object[] argArray) {

+    if(messagePattern == null) {

+      return null;

+    }

+    int i = 0;

+    int len = messagePattern.length();

+    int j = messagePattern.indexOf(DELIM_START);

+    

+  

+    

+    StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50);

+

+    for (int L = 0; L < argArray.length; L++) {

+      

+      char escape = 'x';

+      

+      j = messagePattern.indexOf(DELIM_START, i);

+

+      if (j == -1 || (j+1 == len)) {

+        // no more variables

+        if (i == 0) { // this is a simple string

+          return messagePattern;

+        } else { // add the tail string which contains no variables and return the result.

+          sbuf.append(messagePattern.substring(i, messagePattern.length()));

+          return sbuf.toString();

+        }

+      } else {

+        char delimStop = messagePattern.charAt(j + 1);

+        if (j > 0) {

+          escape = messagePattern.charAt(j - 1);

+        }

+        

+        if(escape == '\\') {

+          L--; // DELIM_START was escaped, thus should not be incremented

+          sbuf.append(messagePattern.substring(i, j-1));

+          sbuf.append(DELIM_START);

+          i = j + 1;

+        } else if ((delimStop != DELIM_STOP)) {

+          // invalid DELIM_START/DELIM_STOP pair

+          sbuf.append(messagePattern.substring(i, messagePattern.length()));

+          return sbuf.toString();

+        } else {

+          // normal case

+          sbuf.append(messagePattern.substring(i, j));

+          sbuf.append(argArray[L]);

+          i = j + 2;

+        }

+      }

+    }

+    // append the characters following the second {} pair.

+    sbuf.append(messagePattern.substring(i, messagePattern.length()));

+    return sbuf.toString();

+  }

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/impl/Util.java b/slf4j-api/src/main/java/org/slf4j/impl/Util.java
new file mode 100644
index 0000000..10dff93
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/impl/Util.java
@@ -0,0 +1,50 @@
+/*

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ *

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ *

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.impl;

+

+

+/**

+ *

+ * An internal utility class.

+ *

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public class Util {

+    

+  static final public void reportFailure(String msg, Throwable t) {

+    System.err.println(msg);

+    System.err.println("Reported exception:");

+    t.printStackTrace();

+  }

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/impl/package.html b/slf4j-api/src/main/java/org/slf4j/impl/package.html
new file mode 100644
index 0000000..f4311e3
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/impl/package.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

+

+

+<html> 

+  <head>

+    <title></title>

+  </head>

+

+

+  <body>

+    

+    <p>Implementations of core logging interfaces defined in the {@link 

+    org.slf4j} package.</p>

+    

+    <hr/>

+  </body> 

+</html>

diff --git a/slf4j-api/src/main/java/org/slf4j/package.html b/slf4j-api/src/main/java/org/slf4j/package.html
new file mode 100644
index 0000000..4f407d0
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/package.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

+

+

+<html> 

+  <head>

+    <title></title>

+  </head>

+

+

+  <body>

+    

+    <p>Core logging interfaces.</p>

+    

+    <hr/>

+  </body> 

+</html>

diff --git a/slf4j-api/src/main/java/org/slf4j/spi/LoggerFactoryBinder.java b/slf4j-api/src/main/java/org/slf4j/spi/LoggerFactoryBinder.java
new file mode 100644
index 0000000..9abedc5
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/spi/LoggerFactoryBinder.java
@@ -0,0 +1,66 @@
+/*

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ *

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ *

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.spi;

+

+import org.slf4j.ILoggerFactory;

+

+/**

+ * An internal interface which helps the static {@link org.slf4j.LoggerFactory} 

+ * class bind with the appropriate {@link ILoggerFactory} instance. 

+ * 

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public interface LoggerFactoryBinder {

+

+  /**

+   * Return the instance of {@link ILoggerFactory} that 

+   * {@link org.slf4j.LoggerFactory} class should bind to.

+   * 

+   * @return the instance of {@link ILoggerFactory} that 

+   * {@link org.slf4j.LoggerFactory} class should bind to.

+   */

+  public ILoggerFactory getLoggerFactory();

+

+  /**

+   * The String form of the {@link ILoggerFactory} object that this 

+   * <code>LoggerFactoryBinder</code> instance is <em>intended</em> to return. 

+   * 

+   * <p>This method allows the developer to intterogate this binder's intention 

+   * which may be different from the {@link ILoggerFactory} instance it is able to 

+   * yield in practice. The discrepency should only occur in case of errors.

+   * 

+   * @return the class name of the intended {@link ILoggerFactory} instance

+   */

+  public String getLoggerFactoryClassStr();

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/spi/MarkerFactoryBinder.java b/slf4j-api/src/main/java/org/slf4j/spi/MarkerFactoryBinder.java
new file mode 100644
index 0000000..fc01d17
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/spi/MarkerFactoryBinder.java
@@ -0,0 +1,67 @@
+/*

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ *

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ *

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.spi;

+

+import org.slf4j.IMarkerFactory;

+

+

+/**

+ * An internal interface which helps the static {@link org.slf4j.MarkerFactory} 

+ * class bind with the appropriate {@link IMarkerFactory} instance. 

+ * 

+ * @author Ceki G&uuml;lc&uuml;

+ */

+public interface MarkerFactoryBinder {

+

+  /**

+   * Return the instance of {@link IMarkerFactory} that 

+   * {@link org.slf4j.MarkerFactory} class should bind to.

+   * 

+   * @return the instance of {@link IMarkerFactory} that 

+   * {@link org.slf4j.MarkerFactory} class should bind to.

+   */

+  public IMarkerFactory getMarkerFactory();

+

+  /**

+   * The String form of the {@link IMarkerFactory} object that this 

+   * <code>MarkerFactoryBinder</code> instance is <em>intended</em> to return. 

+   * 

+   * <p>This method allows the developer to intterogate this binder's intention 

+   * which may be different from the {@link IMarkerFactory} instance it is able to 

+   * return. Such a discrepency should only occur in case of errors.

+   * 

+   * @return the class name of the intended {@link IMarkerFactory} instance

+   */

+  public String getMarkerFactoryClassStr();

+}

diff --git a/slf4j-api/src/main/java/org/slf4j/spi/package.html b/slf4j-api/src/main/java/org/slf4j/spi/package.html
new file mode 100644
index 0000000..242f19d
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/spi/package.html
@@ -0,0 +1,8 @@
+

+<body>

+

+

+Classes and interfaces which are internal to SLF4J. Under most

+circumstances SLF4J users should be oblivious even to the existence of

+this package.

+</body>
\ No newline at end of file
diff --git a/slf4j-api/src/test/java/org/slf4j/AllTest.java b/slf4j-api/src/test/java/org/slf4j/AllTest.java
new file mode 100644
index 0000000..2f430be
--- /dev/null
+++ b/slf4j-api/src/test/java/org/slf4j/AllTest.java
@@ -0,0 +1,20 @@
+// TOTO

+

+package org.slf4j;

+

+import org.slf4j.impl.MessageFormatterTest;

+

+import junit.framework.Test;

+import junit.framework.TestCase;

+import junit.framework.TestSuite;

+

+public class AllTest extends TestCase {

+

+  public static Test suite() {

+    TestSuite suite = new TestSuite();

+    suite.addTestSuite(MessageFormatterTest.class);

+    suite.addTestSuite(BasicMarkerTest.class);

+    return suite;

+  }

+

+}

diff --git a/slf4j-api/src/test/java/org/slf4j/BasicMarkerTest.java b/slf4j-api/src/test/java/org/slf4j/BasicMarkerTest.java
new file mode 100644
index 0000000..bb72f5c
--- /dev/null
+++ b/slf4j-api/src/test/java/org/slf4j/BasicMarkerTest.java
@@ -0,0 +1,114 @@
+/*

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.ch

+ *

+ * All rights reserved.

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ *

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ *

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+package org.slf4j;

+

+import junit.framework.TestCase;

+

+import org.slf4j.impl.BasicMarkerFactory;

+

+

+/**

+ * @author ceki

+ */

+public class BasicMarkerTest extends TestCase {

+  static final String BLUE_STR = "BLUE";

+  static final String RED_STR = "RED";

+  static final String GREEN_STR = "GREEN";

+  static final String COMP_STR = "COMP";

+  static final String MULTI_COMP_STR = "MULTI_COMP";

+  

+  final IMarkerFactory factory;

+  final Marker blue;

+  final Marker red;

+  final Marker green;

+  final Marker comp;

+  final Marker multiComp;

+  

+  public BasicMarkerTest() {

+    factory = new BasicMarkerFactory();

+    

+    blue = factory.getMarker(BLUE_STR);

+    red = factory.getMarker(RED_STR);

+    green = factory.getMarker(GREEN_STR);

+    comp = factory.getMarker(COMP_STR);

+    comp.add(blue);

+    

+    multiComp = factory.getMarker(MULTI_COMP_STR);

+    multiComp.add(green);

+    multiComp.add(comp);

+    

+  }

+  public void testPrimitive() {

+    assertEquals(BLUE_STR, blue.getName());

+    assertTrue(blue.contains(blue));

+    

+    Marker blue2 = factory.getMarker(BLUE_STR);

+    assertEquals(BLUE_STR, blue2.getName());

+    assertEquals(blue, blue2);

+    assertTrue(blue.contains(blue2));

+    assertTrue(blue2.contains(blue));

+  }

+

+  public void testPrimitiveByName() {

+    assertTrue(blue.contains(BLUE_STR));

+  }

+ 

+  public void testComposite() {

+    assertTrue(comp.contains(comp));

+    assertTrue(comp.contains(blue));

+  }

+  

+  public void testCompositeByName() {

+    assertTrue(comp.contains(COMP_STR));

+    assertTrue(comp.contains(BLUE_STR));

+  }

+ 

+

+  public void testMultiComposite() {

+    assertTrue(multiComp.contains(comp));

+    assertTrue(multiComp.contains(blue));

+    assertTrue(multiComp.contains(green));

+    assertFalse(multiComp.contains(red));

+  }

+  

+  public void testMultiCompositeByName() {

+    assertTrue(multiComp.contains(COMP_STR));

+    assertTrue(multiComp.contains(BLUE_STR));

+    assertTrue(multiComp.contains(GREEN_STR));

+    assertFalse(multiComp.contains(RED_STR));

+  }

+ 

+ 

+

+ 

+}

diff --git a/slf4j-api/src/test/java/org/slf4j/impl/MessageFormatterTest.java b/slf4j-api/src/test/java/org/slf4j/impl/MessageFormatterTest.java
new file mode 100644
index 0000000..a240233
--- /dev/null
+++ b/slf4j-api/src/test/java/org/slf4j/impl/MessageFormatterTest.java
@@ -0,0 +1,177 @@
+/* 

+ * Copyright (c) 2004-2005 SLF4J.ORG

+ * Copyright (c) 2004-2005 QOS.CH

+ * 

+ * All rights reserved.

+ * 

+ * Permission is hereby granted, free of charge, to any person obtaining

+ * a copy of this software and associated documentation files (the

+ * "Software"), to  deal in  the Software without  restriction, including

+ * without limitation  the rights to  use, copy, modify,  merge, publish,

+ * distribute, and/or sell copies of  the Software, and to permit persons

+ * to whom  the Software is furnished  to do so, provided  that the above

+ * copyright notice(s) and this permission notice appear in all copies of

+ * the  Software and  that both  the above  copyright notice(s)  and this

+ * permission notice appear in supporting documentation.

+ * 

+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,

+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF

+ * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT

+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR

+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY

+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER

+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF

+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN

+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ * 

+ * Except as  contained in  this notice, the  name of a  copyright holder

+ * shall not be used in advertising or otherwise to promote the sale, use

+ * or other dealings in this Software without prior written authorization

+ * of the copyright holder.

+ *

+ */

+

+package org.slf4j.impl;

+

+import org.slf4j.impl.MessageFormatter;

+

+import junit.framework.TestCase;

+

+

+/**

+ * @author Ceki Gulcu

+ *

+ */

+public class MessageFormatterTest extends TestCase {

+  

+  Integer i1 = new Integer(1);

+  Integer i2 = new Integer(2);

+  Integer i3 = new Integer(3);

+  

+  public void testNull() {

+    String result;

+    result = MessageFormatter.format(null, i1);

+    assertEquals(null, result);

+  }

+  

+  public void testNullParam() {

+    String result;

+    

+    result = MessageFormatter.format("Value is {}.", null);

+    assertEquals("Value is null.", result);

+    

+    result = MessageFormatter.format("Val1 is {}, val2 is {}.", null, null);

+    assertEquals("Val1 is null, val2 is null.", result);

+    

+    result = MessageFormatter.format("Val1 is {}, val2 is {}.", i1, null);

+    assertEquals("Val1 is 1, val2 is null.", result);

+    

+    result = MessageFormatter.format("Val1 is {}, val2 is {}.", null, i2);

+    assertEquals("Val1 is null, val2 is 2.", result);

+ 

+    result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is {}", new Integer[]{null, null, null});

+    assertEquals("Val1 is null, val2 is null, val3 is null", result);

+    

+    result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is {}", new Integer[]{null, i2, i3});

+    assertEquals("Val1 is null, val2 is 2, val3 is 3", result);

+    

+    result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is {}", new Integer[]{null, null, i3});

+    assertEquals("Val1 is null, val2 is null, val3 is 3", result);

+  }

+  

+  

+  public void test1Param() {

+    String result;

+    

+    result = MessageFormatter.format("Value is {}.", i3);

+    assertEquals("Value is 3.", result);

+

+    result = MessageFormatter.format("Value is {", i3);

+    assertEquals("Value is {", result);

+

+    result = MessageFormatter.format("{} is larger than 2.", i3);

+    assertEquals("3 is larger than 2.", result);

+

+    result = MessageFormatter.format("No subst", i3);

+    assertEquals("No subst", result);

+    

+    result = MessageFormatter.format("Incorrect {subst", i3);

+    assertEquals("Incorrect {subst", result);

+    

+    result = MessageFormatter.format("Escaped \\{} subst", i3);

+    assertEquals("Escaped {} subst", result);

+

+    result = MessageFormatter.format("\\{Escaped", i3);

+    assertEquals("{Escaped", result);

+

+    result = MessageFormatter.format("\\{}Escaped", i3);

+    assertEquals("{}Escaped", result);

+    

+    result = MessageFormatter.format("File name is \\{{}}.", "App folder.zip");

+    assertEquals("File name is {App folder.zip}.", result);

+  }

+  

+  public void test2Param() {

+    String result;

+

+    

+    result = MessageFormatter.format("Value {} is smaller than {}.", i1, i2);

+    assertEquals("Value 1 is smaller than 2.", result);

+    

+    result = MessageFormatter.format("Value {} is smaller than {}", i1, i2);

+    assertEquals("Value 1 is smaller than 2", result);

+    

+    result = MessageFormatter.format("{}{}", i1, i2);

+    assertEquals("12", result);

+    

+    result = MessageFormatter.format("Val1={}, Val2={", i1, i2);

+    assertEquals("Val1=1, Val2={", result);

+

+    result = MessageFormatter.format("Value {} is smaller than \\{}", i1, i2);

+    assertEquals("Value 1 is smaller than {}", result);

+    

+    result = MessageFormatter.format("Value {} is smaller than \\{} tail", i1, i2);

+    assertEquals("Value 1 is smaller than {} tail", result);    

+

+    result = MessageFormatter.format("Value {} is smaller than \\{", i1, i2);

+    assertEquals("Value 1 is smaller than \\{", result);  

+    

+    result = MessageFormatter.format("Value {} is smaller than \\{tail", i1, i2);

+    assertEquals("Value 1 is smaller than {tail", result);  

+  

+    

+    result = MessageFormatter.format("Value \\{} is smaller than {}", i1, i2);

+    assertEquals("Value {} is smaller than 1", result);    

+  }

+  

+  public void testArray() {

+    String result;

+

+    Integer[] ia = new Integer[] {i1, i2, i3};

+

+    result = MessageFormatter.arrayFormat("Value {} is smaller than {} and {}.", ia);

+    assertEquals("Value 1 is smaller than 2 and 3.", result);

+    

+    result = MessageFormatter.arrayFormat("{}{}{}", ia);

+    assertEquals("123", result);

+    

+    result = MessageFormatter.arrayFormat("Value {} is smaller than {}.", ia);

+    assertEquals("Value 1 is smaller than 2.", result);

+    

+    result = MessageFormatter.arrayFormat("Value {} is smaller than {}", ia);

+    assertEquals("Value 1 is smaller than 2", result);

+   

+    result = MessageFormatter.arrayFormat("Val={}, {, Val={}", ia);

+    assertEquals("Val=1, {, Val={}", result);

+   

+    result = MessageFormatter.arrayFormat("Val={}, \\{, Val={}", ia);

+    assertEquals("Val=1, {, Val=2", result);

+   

+    

+    result = MessageFormatter.arrayFormat("Val1={}, Val2={", ia);

+    assertEquals("Val1=1, Val2={", result);

+    

+

+  }

+

+}