Updated testcase archetype for ApacheDS 1.5.5, added basic usage examples

git-svn-id: https://svn.apache.org/repos/asf/directory/samples/trunk@835252 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/testcase-archetype/apacheds-testcase-archetype.sh b/testcase-archetype/apacheds-testcase-archetype.sh
index 1f2f91f..5488206 100755
--- a/testcase-archetype/apacheds-testcase-archetype.sh
+++ b/testcase-archetype/apacheds-testcase-archetype.sh
@@ -1,4 +1,4 @@
 #!/bin/sh
 
-mvn archetype:create -DarchetypeGroupId=org.apache.directory.server -DarchetypeArtifactId=apacheds-testcase-archetype -DarchetypeVersion=1.0.2 -DgroupId=$1 -DartifactId=$2
+mvn archetype:generate -DarchetypeGroupId=org.apache.directory.server -DarchetypeArtifactId=apacheds-testcase-archetype -DarchetypeVersion=1.5.5-SNAPSHOT -DgroupId=$1 -DartifactId=$2 -Dversion=1.0-SNAPSHOT
 
diff --git a/testcase-archetype/pom.xml b/testcase-archetype/pom.xml
index 4c61c30..bd73e7d 100644
--- a/testcase-archetype/pom.xml
+++ b/testcase-archetype/pom.xml
@@ -1,12 +1,13 @@
 <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.apache.directory.server</groupId>
-    <artifactId>build</artifactId>
-    <version>1.0.2</version>
+    <artifactId>apacheds-parent</artifactId>
+    <version>1.5.5</version>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <artifactId>apacheds-testcase-archetype</artifactId>
-  <packaging>maven-plugin</packaging>
+  <packaging>jar</packaging>
   <name>ApacheDS Testcase Archetype</name>
+  <version>1.5.5-SNAPSHOT</version>
 </project>
diff --git a/testcase-archetype/src/main/resources/META-INF/archetype.xml b/testcase-archetype/src/main/resources/META-INF/archetype.xml
index fe5b0a3..2be244b 100644
--- a/testcase-archetype/src/main/resources/META-INF/archetype.xml
+++ b/testcase-archetype/src/main/resources/META-INF/archetype.xml
@@ -4,9 +4,13 @@
     <source>src/main/java/Dummy.java</source>
   </sources>
   <testSources>
-    <source>src/test/java/ApacheDSITest.java</source>
+    <source>src/test/java/AdvancedTest.java</source>
+    <source>src/test/java/AdvancedTestApacheDsFactory.java</source>
+    <source>src/test/java/MinimalTest.java</source>
   </testSources>
   <resources>
     <resource>src/test/resources/log4j.properties</resource>
+    <resource>src/test/resources/sevenSeas_data.ldif</resource>
+    <resource>src/test/resources/sevenSeas_schema.ldif</resource>
   </resources>
 </archetype>
diff --git a/testcase-archetype/src/main/resources/archetype-resources/pom.xml b/testcase-archetype/src/main/resources/archetype-resources/pom.xml
index b580da0..9fc640f 100644
--- a/testcase-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/testcase-archetype/src/main/resources/archetype-resources/pom.xml
@@ -5,27 +5,39 @@
   <artifactId>${artifactId}</artifactId>
   <packaging>jar</packaging>
   <version>${version}</version>
-  <name>Schema Project</name>
+  <name>Test Project</name>
   <url>http://directory.apache.org/</url>
 
+  <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>
+    </plugins>
+  </build>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.directory.server</groupId>
-      <artifactId>apacheds-server-unit</artifactId>
-      <version>1.0.2</version>
+      <artifactId>apacheds-server-integ</artifactId>
+      <version>1.5.5</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <version>3.8.1</version>
+      <version>4.5</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
-      <artifactId>nlog4j</artifactId>
-      <version>1.2.25</version>
-      <scope>test</scope>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.3.1</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/main/java/Dummy.java b/testcase-archetype/src/main/resources/archetype-resources/src/main/java/Dummy.java
index 92b6baa..4b4d5f1 100644
--- a/testcase-archetype/src/main/resources/archetype-resources/src/main/java/Dummy.java
+++ b/testcase-archetype/src/main/resources/archetype-resources/src/main/java/Dummy.java
@@ -21,8 +21,8 @@
 
 
 /**
- * This class does nothing.  Makes sure maven builds and the archetype works.
+ * This class does nothing. Makes sure maven builds and the archetype works.
  */
-public class Dummy 
+public class Dummy
 {
 }
diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/test/java/AdvancedTest.java b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/AdvancedTest.java
new file mode 100644
index 0000000..4db547a
--- /dev/null
+++ b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/AdvancedTest.java
@@ -0,0 +1,144 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package ${groupId};
+
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
+
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+
+import javax.naming.Context;
+import javax.naming.directory.Attributes;
+import javax.naming.ldap.InitialLdapContext;
+import javax.naming.ldap.LdapContext;
+
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.integ.Level;
+import org.apache.directory.server.core.integ.annotations.ApplyLdifFiles;
+import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.core.integ.annotations.Factory;
+import org.apache.directory.server.integ.SiRunner;
+import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.shared.ldap.entry.Modification;
+import org.apache.directory.shared.ldap.entry.ModificationOperation;
+import org.apache.directory.shared.ldap.entry.client.ClientModification;
+import org.apache.directory.shared.ldap.entry.client.DefaultClientAttribute;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.DummySSLSocketFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * This is an advanced test template.
+ * It shows how to configure the embedded ApacheDS:
+ * <ul>
+ * <li>Create a partition 'o=sevenSeas'</li>
+ * <li>Enable LDAP and LDAPS protocol</li>
+ * <li>Enable the 'nis' schema</li>
+ * <li>Inject a new custom schema from an LDIF file</li>
+ * <li>Inject test data from an LDIF file</li>
+ * <li>Restart the embedded ApacheDS after each test method</li>
+ * <li></li>
+ * </ul>  
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+@RunWith(SiRunner.class)
+@CleanupLevel(Level.METHOD)
+@Factory(AdvancedTestApacheDsFactory.class)
+@ApplyLdifFiles(
+    { "/sevenSeas_schema.ldif", "/sevenSeas_data.ldif" })
+public class AdvancedTest
+{
+    // the LdapServer is injected on test startup
+    public static LdapServer ldapServer;
+
+
+    @Before
+    public void enableNisSchema() throws Exception
+    {
+        List<Modification> mod = new ArrayList<Modification>();
+        mod.add( new ClientModification( ModificationOperation.REMOVE_ATTRIBUTE, new DefaultClientAttribute(
+            "m-disabled" ) ) );
+        ldapServer.getDirectoryService().getAdminSession().modify( new LdapDN( "cn=nis,ou=schema" ), mod );
+    }
+
+
+    /**
+     * Test that partition 'o=sevenSeas' exists.
+     * 
+     * @throws Exception
+     */
+    @Test
+    public void testCustomPartitionExists() throws Exception
+    {
+        assertTrue( ldapServer.getDirectoryService().getAdminSession().exists( new LdapDN( "o=sevenSeas" ) ) );
+    }
+
+
+    /**
+     * Test that LDAPS works. Use JNDI as the request must go over the wire.
+     * Use a dummy SSL factory that accepts the self-signed server certificate.
+     * 
+     * @throws Exception
+     */
+    @Test
+    public void testLdaps() throws Exception
+    {
+        Hashtable<String, String> env = new Hashtable<String, String>();
+        env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
+        env.put( Context.PROVIDER_URL, "ldaps://localhost:" + ldapServer.getPortSSL() );
+        env.put( Context.SECURITY_PRINCIPAL, ServerDNConstants.ADMIN_SYSTEM_DN );
+        env.put( Context.SECURITY_CREDENTIALS, "secret" );
+        env.put( Context.SECURITY_AUTHENTICATION, "simple" );
+        env.put( "java.naming.ldap.factory.socket", DummySSLSocketFactory.class.getName() );
+        LdapContext ctx = new InitialLdapContext( env, null );
+
+        assertNotNull( ctx.lookup( "ou=users,ou=system" ) );
+    }
+
+
+    /**
+     * Test that the custom schema and the data was injected.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testCustomSchemaAndData() throws Exception
+    {
+        // use the helper method to create a JNDI context from the LdapServer
+        LdapContext ctx = getWiredContext( ldapServer );
+
+        Attributes attributes = ctx.getAttributes( "cn=HMS Victory,ou=ships,o=sevenSeas" );
+        assertNotNull( attributes );
+        assertNotNull( attributes.get( "objectClass" ) );
+        assertTrue( attributes.get( "objectClass" ).contains( "ship" ) );
+        assertNotNull( attributes.get( "numberOfGuns" ) );
+        assertEquals( "104", attributes.get( "numberOfGuns" ).get() );
+    }
+
+}
diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/test/java/AdvancedTestApacheDsFactory.java b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/AdvancedTestApacheDsFactory.java
new file mode 100644
index 0000000..c539955
--- /dev/null
+++ b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/AdvancedTestApacheDsFactory.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package ${groupId};
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.directory.server.core.DefaultDirectoryService;
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.integ.IntegrationUtils;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
+import org.apache.directory.server.integ.LdapServerFactory;
+import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.server.protocol.shared.transport.TcpTransport;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.mina.util.AvailablePortFinder;
+
+
+/**
+ * A LdapServerFactory for AdvancedTest.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class AdvancedTestApacheDsFactory implements LdapServerFactory
+{
+    public LdapServer newInstance() throws Exception
+    {
+        // default configuration
+        DirectoryService service = new DefaultDirectoryService();
+        IntegrationUtils.doDelete( service.getWorkingDirectory() );
+        service.getChangeLog().setEnabled( true );
+        service.setAllowAnonymousAccess( true );
+        service.setShutdownHookEnabled( false );
+
+        // create a new partition "o=sevenSeas" with some indices
+        JdbmPartition example = new JdbmPartition();
+        example.setCacheSize( 500 );
+        example.setSuffix( "o=sevenSeas" );
+        example.setId( "sevenSeas" );
+        Set<Index<?, ServerEntry>> indexedAttrs = new HashSet<Index<?, ServerEntry>>();
+        indexedAttrs.add( new JdbmIndex<String, ServerEntry>( "cn" ) );
+        indexedAttrs.add( new JdbmIndex<String, ServerEntry>( "ou" ) );
+        indexedAttrs.add( new JdbmIndex<String, ServerEntry>( "dc" ) );
+        indexedAttrs.add( new JdbmIndex<String, ServerEntry>( "objectClass" ) );
+        example.setIndexedAttributes( indexedAttrs );
+        service.addPartition( example );
+
+        // create the LDAP Server, create a transport for LDAP and LDAPS
+        LdapServer ldapServer = new LdapServer();
+        ldapServer.setDirectoryService( service );
+        int ldapPort = AvailablePortFinder.getNextAvailable( 1024 );
+        TcpTransport ldapTransport = new TcpTransport( ldapPort );
+        int ldapsPort = AvailablePortFinder.getNextAvailable( ldapPort + 1 );
+        TcpTransport ldapsTransport = new TcpTransport( ldapsPort );
+        ldapsTransport.setEnableSSL( true );
+        ldapServer.setTransports( ldapTransport, ldapsTransport );
+        ldapServer.setAllowAnonymousAccess( true );
+
+        return ldapServer;
+    }
+
+}
diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/test/java/ApacheDSITest.java b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/ApacheDSITest.java
deleted file mode 100644
index 12ac457..0000000
--- a/testcase-archetype/src/main/resources/archetype-resources/src/test/java/ApacheDSITest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-package ${groupId};
-
-
-import java.util.Hashtable;
-
-import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
-
-import org.apache.directory.server.unit.AbstractServerTest;
-
-
-
-/**
- * An example ApacheDS integration test.  
- * 
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$
- */
-public class ApacheDSITest extends AbstractServerTest
-{
-    private DirContext ctx = null;
-
-
-    /**
-     * Get a connection to the embedded server using the SUN JNDI LDAP provider
-     * over the wire.
-     */
-    public void setUp() throws Exception
-    {
-        // Starts up the embedded ApacheDS instance.
-        super.setUp();
-
-        // -------------------------------------------------------------------
-        // Get a connection (JNDI context) to the LDAP server       
-        // -------------------------------------------------------------------
-
-        Hashtable env = new Hashtable();
-        env.put( "java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory" );
-        env.put( "java.naming.provider.url", "ldap://localhost:" + port + "/ou=system" );
-        env.put( "java.naming.security.principal", "uid=admin,ou=system" );
-        env.put( "java.naming.security.credentials", "secret" );
-        env.put( "java.naming.security.authentication", "simple" );
-        ctx = new InitialDirContext( env );
-    }
-
-
-    /**
-     * Closes our context before shuting down the server.
-     */
-    public void tearDown() throws Exception
-    {
-        ctx.close();
-        super.tearDown();
-    }
-
-
-    /**
-     * An example test reads and assert an attribute value in the ou=system
-     * context.
-     */
-    public void testExample() throws NamingException
-    {
-        Attributes system = ctx.getAttributes( "" );
-        assertNotNull( system );
-        assertEquals( "system", system.get( "ou" ).get() );
-    }
-}
diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/test/java/MinimalTest.java b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/MinimalTest.java
new file mode 100644
index 0000000..6232e2c
--- /dev/null
+++ b/testcase-archetype/src/main/resources/archetype-resources/src/test/java/MinimalTest.java
@@ -0,0 +1,219 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package ${groupId};
+
+
+import static junit.framework.Assert.assertNotNull;
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.BasicAttributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.ModificationItem;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.LdapContext;
+
+import org.apache.directory.server.core.CoreSession;
+import org.apache.directory.server.core.entry.DefaultServerEntry;
+import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.filtering.EntryFilteringCursor;
+import org.apache.directory.server.integ.SiRunner;
+import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.server.schema.registries.Registries;
+import org.apache.directory.shared.ldap.entry.Modification;
+import org.apache.directory.shared.ldap.entry.ModificationOperation;
+import org.apache.directory.shared.ldap.entry.client.ClientModification;
+import org.apache.directory.shared.ldap.entry.client.ClientStringValue;
+import org.apache.directory.shared.ldap.entry.client.DefaultClientAttribute;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
+import org.apache.directory.shared.ldap.filter.SearchScope;
+import org.apache.directory.shared.ldap.message.AliasDerefMode;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * This is a minimal test template.
+ * It just starts up an embedded ApacheDS with default configuration:
+ * <ul>
+ * <li>Only system partion 'ou=system' and schema partition 'ou=schema' exist.</li>
+ * <li>Only LDAP protocol (no LDAPS) is enabled, listening on port 1024.</li>
+ * <li>The directory data can also be accessed directly via the core API.</li>
+ * <li></li>
+ * </ul>
+ * 
+ * The two tests methods demonstrate how to use the core API and JNDI 
+ * to access the embedded ApacheDS within the JVM or over the wire.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+@RunWith(SiRunner.class)
+public class MinimalTest
+{
+    // the LdapServer is injected on test startup
+    public static LdapServer ldapServer;
+
+
+    /**
+     * Demonstrates how to use the core API.
+     * Note that those requests don't go over the wire but access
+     * the ApacheDS within the same JVM.
+     * 
+     * @throws Exception
+     */
+    @Test
+    public void demonstrateCoreAPI() throws Exception
+    {
+        // get the admin session which has unlimited access rights to the directory
+        CoreSession session = ldapServer.getDirectoryService().getAdminSession();
+        Registries registries = ldapServer.getDirectoryService().getRegistries();
+
+        // this entry should exist
+        assertTrue( session.exists( new LdapDN( "ou=users,ou=system" ) ) );
+
+        // this entry should not exist
+        assertFalse( session.exists( new LdapDN( "uid=foo.bar,ou=users,ou=system" ) ) );
+
+        // create an entry
+        ServerEntry newEntry = new DefaultServerEntry( registries, new LdapDN( "uid=foo.bar,ou=users,ou=system" ) );
+        newEntry.add( "objectClass", "top", "person", "organizationalPerson", "inetOrgPerson" );
+        newEntry.add( "uid", "foo.bar" );
+        newEntry.add( "cn", "Foo Bar" );
+        newEntry.add( "sn", "Bar" );
+        newEntry.add( "givenName", "Foo" );
+        session.add( newEntry );
+
+        // lookup entry
+        ServerEntry entry = session.lookup( new LdapDN( "uid=foo.bar,ou=users,ou=system" ) );
+        assertTrue( entry.hasObjectClass( "inetOrgPerson" ) );
+        assertNotNull( entry.get( "cn" ) );
+        assertEquals( "Foo Bar", entry.get( "cn" ).get().getString() );
+
+        // modify entry
+        List<Modification> modifications = new ArrayList<Modification>();
+        modifications.add( new ClientModification( ModificationOperation.ADD_ATTRIBUTE, new DefaultClientAttribute(
+            "mail", "bar@example.com", "foo.bar@example.com" ) ) );
+        modifications.add( new ClientModification( ModificationOperation.REMOVE_ATTRIBUTE, new DefaultClientAttribute(
+            "givenName" ) ) );
+        modifications.add( new ClientModification( ModificationOperation.REPLACE_ATTRIBUTE, new DefaultClientAttribute(
+            "description", "This is Foo Bar." ) ) );
+        session.modify( new LdapDN( "uid=foo.bar,ou=users,ou=system" ), modifications );
+
+        // search
+        EntryFilteringCursor cursor = session.search( new LdapDN( "ou=users,ou=system" ), SearchScope.ONELEVEL,
+            new EqualityNode<String>( "uid", new ClientStringValue( "foo.bar" ) ), AliasDerefMode.DEREF_ALWAYS, null );
+        cursor.beforeFirst();
+        assertTrue( cursor.next() );
+        assertNotNull( cursor.get() );
+        assertEquals( "uid=foo.bar,ou=users,ou=system", cursor.get().getDn().getUpName() );
+        assertFalse( cursor.next() );
+        cursor.close();
+
+        // delete entry
+        session.delete( new LdapDN( "uid=foo.bar,ou=users,ou=system" ) );
+    }
+
+
+    /**
+     * Demonstrates how to use the JNDI API to access the embedded
+     * ApacheDS over the wire.
+     * 
+     * @throws Exception
+     */
+    @Test
+    public void demonstrateJndiAPI() throws Exception
+    {
+        // use the helper method to create a JNDI context from the LdapServer
+        LdapContext ctx = getWiredContext( ldapServer );
+
+        // this entry should exist
+        assertNotNull( ctx.lookup( "ou=users,ou=system" ) );
+
+        // this entry should not exist
+        try
+        {
+            ctx.lookup( "uid=foo.bar,ou=users,ou=system" );
+            fail( "uid=foo.bar,ou=users,ou=system doesn't exist." );
+        }
+        catch ( NameNotFoundException e )
+        {
+            // expected
+        }
+
+        // create an entry
+        Attributes newAttributes = new BasicAttributes();
+        Attribute newOcAttribute = new BasicAttribute( "objectClass" );
+        newOcAttribute.add( "top" );
+        newOcAttribute.add( "person" );
+        newOcAttribute.add( "organizationalPerson" );
+        newOcAttribute.add( "inetOrgPerson" );
+        newAttributes.put( newOcAttribute );
+        newAttributes.put( "uid", "foo.bar" );
+        newAttributes.put( "cn", "Foo Bar" );
+        newAttributes.put( "sn", "Bar" );
+        newAttributes.put( "givenName", "Foo" );
+        ctx.bind( "uid=foo.bar,ou=users,ou=system", null, newAttributes );
+
+        // lookup entry
+        Attributes attributes = ctx.getAttributes( "uid=foo.bar,ou=users,ou=system" );
+        assertNotNull( attributes.get( "objectClass" ) );
+        assertTrue( attributes.get( "objectClass" ).contains( "inetOrgPerson" ) );
+        assertNotNull( attributes.get( "cn" ) );
+        assertEquals( "Foo Bar", attributes.get( "cn" ).get() );
+
+        // modify entry
+        ModificationItem[] modificatons = new ModificationItem[3];
+        modificatons[0] = new ModificationItem( DirContext.ADD_ATTRIBUTE, new BasicAttribute( "mail",
+            "foo.bar@example.com" ) );
+        modificatons[1] = new ModificationItem( DirContext.REMOVE_ATTRIBUTE, new BasicAttribute( "givenName" ) );
+        modificatons[2] = new ModificationItem( DirContext.REPLACE_ATTRIBUTE, new BasicAttribute( "description",
+            "This is Foo Bar." ) );
+        ctx.modifyAttributes( "uid=foo.bar,ou=users,ou=system", modificatons );
+
+        // search
+        SearchControls searchControls = new SearchControls();
+        NamingEnumeration<SearchResult> results = ctx.search( "ou=users,ou=system", "(uid=foo.bar)", searchControls );
+        assertTrue( results.hasMore() );
+        SearchResult next = results.next();
+        assertNotNull( next );
+        assertEquals( "uid=foo.bar,ou=users,ou=system", next.getNameInNamespace() );
+        assertFalse( results.hasMore() );
+        results.close();
+
+        // delete entry
+        ctx.unbind( "uid=foo.bar,ou=users,ou=system" );
+
+        ctx.close();
+    }
+
+}
diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/test/resources/sevenSeas_data.ldif b/testcase-archetype/src/main/resources/archetype-resources/src/test/resources/sevenSeas_data.ldif
new file mode 100644
index 0000000..945c74b
--- /dev/null
+++ b/testcase-archetype/src/main/resources/archetype-resources/src/test/resources/sevenSeas_data.ldif
@@ -0,0 +1,236 @@
+# Sample LDIF data for the ApacheDS v1.0 Basic User's Guide

+#

+# Some sailors and their ships

+# userpassword for all persons is "pass"

+#

+version: 1

+

+dn: o=sevenSeas

+objectClass: organization

+objectClass: top

+o: sevenSeas

+

+dn: ou=people,o=sevenSeas

+objectClass: organizationalUnit

+objectClass: top

+description: Contains entries which describe persons (seamen)

+ou: people

+

+dn: ou=groups,o=sevenSeas

+objectClass: organizationalUnit

+objectClass: top

+description: Contains entries which describe groups (crews, for instance)

+ou: groups

+

+dn: ou=crews,ou=groups,o=sevenSeas

+objectClass: organizationalUnit

+objectClass: top

+description: Contains entries which describe ship crews

+ou: crews

+

+dn: ou=ranks,ou=groups,o=sevenSeas

+objectClass: organizationalUnit

+objectClass: top

+description: Contains entries which describe naval ranks (e.g. captain)

+ou: ranks

+

+dn: ou=ships,o=sevenSeas

+objectClass: organizationalUnit

+objectClass: top

+description: Contains entries which describe ships

+ou: ships

+

+# HMS Lydia Crew

+# --------------

+

+dn: cn=Horatio Hornblower,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Horatio Hornblower

+description: Capt. Horatio Hornblower, R.N

+givenName: Horatio

+sn: Hornblower

+uid: hhornblo

+mail: hhornblo@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=William Bush,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: William Bush

+description: Lt. William Bush

+givenName: William

+manager: cn=Horatio Hornblower,ou=people,o=sevenSeas

+sn: Bush

+uid: wbush

+mail: wbush@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=Thomas Quist,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Thomas Quist

+description: Seaman Quist

+givenName: Thomas

+manager: cn=Horatio Hornblower,ou=people,o=sevenSeas

+sn: Quist

+uid: tquist

+mail: tquist@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=Moultrie Crystal,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Moultrie Crystal

+description: Lt. Crystal

+givenName: Moultrie

+manager: cn=Horatio Hornblower,ou=people,o=sevenSeas

+sn: Crystal

+uid: mchrysta

+mail: mchrysta@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=HMS Lydia,ou=crews,ou=groups,o=sevenSeas

+objectClass: groupOfUniqueNames

+objectClass: top

+cn: HMS Lydia

+uniqueMember: cn=Horatio Hornblower,ou=people,o=sevenSeas

+uniqueMember: cn=William Bush,ou=people,o=sevenSeas

+uniqueMember: cn=Thomas Quist,ou=people,o=sevenSeas

+uniqueMember: cn=Moultrie Crystal,ou=people,o=sevenSeas

+

+# HMS Victory Crew

+# ----------------

+

+dn: cn=Horatio Nelson,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Horatio Nelson

+description: Lord Horatio Nelson

+givenName: Horatio

+sn: Nelson

+uid: hnelson

+mail: hnelson@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=Thomas Masterman Hardy,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Thomas Masterman Hardy

+description: Sir Thomas Masterman Hardy

+givenName: Thomas

+manager: cn=Horatio Nelson,ou=people,o=sevenSeas

+sn: Hardy

+uid: thardy

+mail: thardy@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=Cornelius Buckley,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Cornelius Buckley

+description: LM Cornelius Buckley

+givenName: Cornelius

+manager: cn=Horatio Nelson,ou=people,o=sevenSeas

+sn: Buckley

+uid: cbuckley

+mail: cbuckley@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=HMS Victory,ou=crews,ou=groups,o=sevenSeas

+objectClass: groupOfUniqueNames

+objectClass: top

+cn: HMS Victory

+uniqueMember: cn=Horatio Nelson,ou=people,o=sevenSeas

+uniqueMember: cn=Thomas Masterman Hardy,ou=people,o=sevenSeas

+uniqueMember: cn=Cornelius Buckley,ou=people,o=sevenSeas

+

+dn: cn=HMS Victory,ou=ships,o=sevenSeas

+objectClass: top

+objectClass: ship

+cn: HMS Victory

+numberOfGuns: 104

+description: a ship of the line of the Royal Navy

+description: built between 1759 and 1765

+

+# HMS Bounty Crew

+# ---------------

+

+dn: cn=William Bligh,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: William Bligh

+description: Captain William Bligh

+givenName: William

+sn: Bligh

+uid: wbligh

+mail: wbligh@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=Fletcher Christian,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: Fletcher Christian

+description: Lieutenant Fletcher Christian

+givenName: Fletcher

+manager: cn=William Bligh,ou=people,o=sevenSeas

+sn: Christian

+uid: fchristi

+mail: fchristi@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=John Fryer,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: John Fryer

+description: Master John Fryer

+givenName: John

+manager: cn=William Bligh,ou=people,o=sevenSeas

+sn: Fryer

+uid: jfryer

+mail: jfryer@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=John Hallett,ou=people,o=sevenSeas

+objectClass: person

+objectClass: organizationalPerson

+objectClass: inetOrgPerson

+objectClass: top

+cn: John Hallett

+description: Midshipman John Hallett

+givenName: John

+manager: cn=William Bligh,ou=people,o=sevenSeas

+sn: Hallett

+uid: jhallett

+mail: jhallett@royalnavy.mod.uk

+userPassword: {SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=

+

+dn: cn=HMS Bounty,ou=crews,ou=groups,o=sevenSeas

+objectClass: groupOfUniqueNames

+objectClass: top

+cn: HMS Bounty

+uniqueMember: cn=William Bligh,ou=people,o=sevenSeas

+uniqueMember: cn=Fletcher Christian,ou=people,o=sevenSeas

+uniqueMember: cn=John Fryer,ou=people,o=sevenSeas

+uniqueMember: cn=John Hallett,ou=people,o=sevenSeas

+

diff --git a/testcase-archetype/src/main/resources/archetype-resources/src/test/resources/sevenSeas_schema.ldif b/testcase-archetype/src/main/resources/archetype-resources/src/test/resources/sevenSeas_schema.ldif
new file mode 100644
index 0000000..b1826a7
--- /dev/null
+++ b/testcase-archetype/src/main/resources/archetype-resources/src/test/resources/sevenSeas_schema.ldif
@@ -0,0 +1,88 @@
+# sevenSeas

+# Generated by LDAP Studio on 27. April 2007 14:59:52

+

+dn: cn=sevenSeas, ou=schema

+objectclass: metaSchema

+objectclass: top

+cn: sevenSeas

+

+dn: ou=attributeTypes, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: attributetypes

+

+dn: m-oid=1.3.6.1.4.1.18060.0.4.3.2.1, ou=attributeTypes, cn=sevenSeas, ou=schem

+ a

+objectclass: metaAttributeType

+objectclass: metaTop

+objectclass: top

+m-oid: 1.3.6.1.4.1.18060.0.4.3.2.1

+m-name: numberOfGuns

+m-description: Number of guns of a ship

+m-equality: integerMatch

+m-syntax: 1.3.6.1.4.1.1466.115.121.1.27

+m-singleValue: TRUE

+

+dn: ou=comparators, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: comparators

+

+dn: ou=ditContentRules, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: ditcontentrules

+

+dn: ou=ditStructureRules, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: ditstructurerules

+

+dn: ou=matchingRules, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: matchingrules

+

+dn: ou=matchingRuleUse, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: matchingruleuse

+

+dn: ou=nameForms, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: nameforms

+

+dn: ou=normalizers, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: normalizers

+

+dn: ou=objectClasses, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: objectClasses

+

+dn: m-oid=1.3.6.1.4.1.18060.0.4.3.3.1, ou=objectClasses, cn=sevenSeas, ou=schema

+ 

+objectclass: metaObjectclass

+objectclass: metaTop

+objectclass: top

+m-oid: 1.3.6.1.4.1.18060.0.4.3.3.1

+m-name: ship

+m-description: An entry which represents a ship

+m-supObjectClass: top

+m-must: cn

+m-may: numberOfGuns

+m-may: description

+

+dn: ou=syntaxCheckers, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: syntaxcheckers

+

+dn: ou=syntaxes, cn=sevenSeas, ou=schema

+objectclass: organizationalUnit

+objectclass: top

+ou: syntaxes

+