diff --git a/src/example/configurations/jdbc-example/build.xml b/src/example/configurations/jdbc-example/build.xml
new file mode 100644
index 00000000..3dfd3bb3
--- /dev/null
+++ b/src/example/configurations/jdbc-example/build.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/example/configurations/jdbc-example/ivy.xml b/src/example/configurations/jdbc-example/ivy.xml
new file mode 100644
index 00000000..1bcab253
--- /dev/null
+++ b/src/example/configurations/jdbc-example/ivy.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ This is an example project that aims to demonstrate the usage of the configuration in ivy.
+ This project provide 4 configurations. Each configurations describe the requirement to build or run the project
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/example/configurations/jdbc-example/src/dev.properties b/src/example/configurations/jdbc-example/src/dev.properties
new file mode 100644
index 00000000..11b36df8
--- /dev/null
+++ b/src/example/configurations/jdbc-example/src/dev.properties
@@ -0,0 +1 @@
+driver.class=com.mckoi.JDBCDriver
\ No newline at end of file
diff --git a/src/example/configurations/jdbc-example/src/example/ConfigurationsExample.java b/src/example/configurations/jdbc-example/src/example/ConfigurationsExample.java
new file mode 100644
index 00000000..73b2baba
--- /dev/null
+++ b/src/example/configurations/jdbc-example/src/example/ConfigurationsExample.java
@@ -0,0 +1,44 @@
+package example;
+
+import java.io.IOException;
+import java.util.Properties;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+
+public class ConfigurationsExample {
+
+ public static void main(String[] args) {
+ String jdbcPropToLoad = "prod.properties";
+ CommandLineParser parser = new PosixParser();
+ Options options = new Options();
+ options.addOption("d", "dev", false, "Dev tag to launch app in dev mode. Means that app will launch embedded mckoi db.");
+ try {
+ CommandLine line = parser.parse( options, args );
+ if(line.hasOption("d")) {
+ System.err.println("App is in DEV mode");
+ jdbcPropToLoad = "dev.properties";
+ }
+ }
+ catch( ParseException exp ) {
+ System.err.println( "Parsing failed. Reason: " + exp.getMessage() );
+ }
+ Properties p = new Properties();
+ try {
+ p.load(ConfigurationsExample.class.getResourceAsStream("/"+jdbcPropToLoad));
+ } catch (IOException e) {
+ System.err.println( "Properties loading failed. Reason: " + e.getMessage());
+ }
+ try {
+ String clazz = p.getProperty("driver.class");
+ Class.forName(clazz);
+ System.out.println(" Jdbc driver loaded :"+clazz);
+ } catch (ClassNotFoundException e) {
+ System.err.println( "Jdbc Driver class loading failed. Reason: " + e.getMessage());
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/example/configurations/jdbc-example/src/prod.properties b/src/example/configurations/jdbc-example/src/prod.properties
new file mode 100644
index 00000000..3dfc5d5a
--- /dev/null
+++ b/src/example/configurations/jdbc-example/src/prod.properties
@@ -0,0 +1 @@
+driver.class=org.gjt.mm.mysql.Driver
\ No newline at end of file
diff --git a/src/example/configurations/multi-projects/filter-framework/build.xml b/src/example/configurations/multi-projects/filter-framework/build.xml
new file mode 100644
index 00000000..ff0d92db
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/build.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/example/configurations/multi-projects/filter-framework/ivy.xml b/src/example/configurations/multi-projects/filter-framework/ivy.xml
new file mode 100644
index 00000000..dc55aaa6
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/ivy.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/example/configurations/multi-projects/filter-framework/src/filter/FilterProvider.java b/src/example/configurations/multi-projects/filter-framework/src/filter/FilterProvider.java
new file mode 100644
index 00000000..c0c21c15
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/src/filter/FilterProvider.java
@@ -0,0 +1,20 @@
+package filter;
+
+
+public class FilterProvider {
+
+ public static IFilter getFilter() {
+ try {
+ Class clazz = Class.forName("filter.ccimpl.CCFilter");
+ return (IFilter) clazz.newInstance();
+ } catch (Exception e) {
+ try {
+ Class clazz = Class.forName("filter.hmimpl.HMFilter");
+ return (IFilter) clazz.newInstance();
+ } catch (Exception e1) {
+ System.err.println("No filter implementation found in classpath !");
+ }
+ return null;
+ }
+ }
+}
diff --git a/src/example/configurations/multi-projects/filter-framework/src/filter/IFilter.java b/src/example/configurations/multi-projects/filter-framework/src/filter/IFilter.java
new file mode 100644
index 00000000..ff03f2a8
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/src/filter/IFilter.java
@@ -0,0 +1,5 @@
+package filter;
+
+public interface IFilter {
+ String[] filter(String[] values, String prefix);
+}
diff --git a/src/example/configurations/multi-projects/filter-framework/src/filter/ccimpl/CCFilter.java b/src/example/configurations/multi-projects/filter-framework/src/filter/ccimpl/CCFilter.java
new file mode 100644
index 00000000..2a0742cd
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/src/filter/ccimpl/CCFilter.java
@@ -0,0 +1,28 @@
+package filter.ccimpl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
+import filter.IFilter;
+
+public class CCFilter implements IFilter {
+
+ public String[] filter(String[] values, final String prefix) {
+ if(values == null) {
+ return null;
+ }
+ if(prefix == null) {
+ return values;
+ }
+
+ List result = new ArrayList(Arrays.asList(values));
+ CollectionUtils.filter(result, new Predicate() {
+ public boolean evaluate(Object o) {
+ return o!= null && o.toString().startsWith(prefix);
+ }
+ });
+ return (String[]) result.toArray(new String[result.size()]);
+ }
+}
diff --git a/src/example/configurations/multi-projects/filter-framework/src/filter/hmimpl/HMFilter.java b/src/example/configurations/multi-projects/filter-framework/src/filter/hmimpl/HMFilter.java
new file mode 100644
index 00000000..a3d62169
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/src/filter/hmimpl/HMFilter.java
@@ -0,0 +1,25 @@
+package filter.hmimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import filter.IFilter;
+
+public class HMFilter implements IFilter {
+
+ public String[] filter(String[] values, String prefix) {
+ if(values == null) {
+ return null;
+ }
+ if(prefix == null) {
+ return values;
+ }
+ List result = new ArrayList();
+ for (int i = 0; i < values.length; i++) {
+ String string = values[i];
+ if(string != null && string.startsWith(prefix)) {
+ result.add(string);
+ }
+ }
+ return (String[]) result.toArray(new String[result.size()]);
+ }
+}
diff --git a/src/example/configurations/multi-projects/filter-framework/test/filter/AbstractTestFilter.java b/src/example/configurations/multi-projects/filter-framework/test/filter/AbstractTestFilter.java
new file mode 100644
index 00000000..3182d25a
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/test/filter/AbstractTestFilter.java
@@ -0,0 +1,53 @@
+package filter;
+
+import junit.framework.TestCase;
+
+public abstract class AbstractTestFilter extends TestCase {
+
+ public void testFilterNull() {
+ Exception err = null;
+ try {
+ getIFilter().filter(null, null);
+ } catch (NullPointerException npe) {
+ err = npe;
+ }
+ assertNull(err);
+ }
+
+ /**
+ * @return
+ */
+ public abstract IFilter getIFilter() ;
+
+ public void testFilterNullValues() {
+ Exception err = null;
+ try {
+ getIFilter().filter(null, "test");
+ } catch (NullPointerException npe) {
+ err = npe;
+ }
+ assertNull(err);
+ }
+
+ public void testFilterNullPrefix() {
+ Exception err = null;
+ try {
+ getIFilter().filter(new String[]{"test"}, null);
+ } catch (NullPointerException npe) {
+ err = npe;
+ }
+ assertNull(err);
+ }
+
+ public void testFilter() {
+ String[] result = getIFilter().filter(new String[]{"test", "nogood", "mustbe filtered"}, "t");
+ assertNotNull(result);
+ assertEquals(result.length, 1);
+ }
+
+ public void testFilterWithNullValues() {
+ String[] result = getIFilter().filter(new String[]{"test", null, "mustbe filtered"}, "t");
+ assertNotNull(result);
+ assertEquals(result.length, 1);
+ }
+}
diff --git a/src/example/configurations/multi-projects/filter-framework/test/filter/ccimpl/CCFilterTest.java b/src/example/configurations/multi-projects/filter-framework/test/filter/ccimpl/CCFilterTest.java
new file mode 100644
index 00000000..9f56ecbd
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/test/filter/ccimpl/CCFilterTest.java
@@ -0,0 +1,10 @@
+package filter.ccimpl;
+
+import filter.AbstractTestFilter;
+import filter.IFilter;
+
+public class CCFilterTest extends AbstractTestFilter {
+ public IFilter getIFilter() {
+ return new CCFilter();
+ }
+}
diff --git a/src/example/configurations/multi-projects/filter-framework/test/filter/hmimpl/HMFilterTest.java b/src/example/configurations/multi-projects/filter-framework/test/filter/hmimpl/HMFilterTest.java
new file mode 100644
index 00000000..bf0ec739
--- /dev/null
+++ b/src/example/configurations/multi-projects/filter-framework/test/filter/hmimpl/HMFilterTest.java
@@ -0,0 +1,10 @@
+package filter.hmimpl;
+
+import filter.AbstractTestFilter;
+import filter.IFilter;
+
+public class HMFilterTest extends AbstractTestFilter {
+ public IFilter getIFilter() {
+ return new HMFilter();
+ }
+}
diff --git a/src/example/configurations/multi-projects/myapp/build.xml b/src/example/configurations/multi-projects/myapp/build.xml
new file mode 100644
index 00000000..d232f15b
--- /dev/null
+++ b/src/example/configurations/multi-projects/myapp/build.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/example/configurations/multi-projects/myapp/ivy.xml b/src/example/configurations/multi-projects/myapp/ivy.xml
new file mode 100644
index 00000000..9c9e2575
--- /dev/null
+++ b/src/example/configurations/multi-projects/myapp/ivy.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/example/configurations/multi-projects/myapp/src/myapp/Main.java b/src/example/configurations/multi-projects/myapp/src/myapp/Main.java
new file mode 100644
index 00000000..a21c8003
--- /dev/null
+++ b/src/example/configurations/multi-projects/myapp/src/myapp/Main.java
@@ -0,0 +1,16 @@
+package myapp;
+
+import java.util.Arrays;
+import filter.FilterProvider;
+import filter.IFilter;
+
+public class Main {
+
+ public static void main(String[] args) {
+ String toFilter[] = new String[]{"one", "two", "tree", "four"};
+ IFilter filter = FilterProvider.getFilter();
+ System.out.println("Filtering with:"+filter.getClass());
+ String filtered[] = filter.filter(toFilter, "t");
+ System.out.println("Result :"+Arrays.asList(filtered));
+ }
+}