My initial aim was to demonstrate embedding ApacheDS in a very simple, but nevertheless impressive way. I thought about embedding the server in Apache Tomcat first. But then I got a better plan: Creating a standard web application which wraps ApacheDS and can be deployed on any compliant application server. ApacheDS in a war-archive!
|Proof of concept character|
Although it works well, please note that this is just an example on how to embed ApacheDS in an application! If you plan to run the server as LDAP production system, this is not the first option to consider. Some more steps have to be done, especially in the area of configuration.
The solution is quite simple. A web application carries all the necessary jar files for ApacheDS within the lib-directory of the WEB-INF folder. When the web application is started by the servlet container, appropriate code has to be executed to start ApacheDS. And the server has to be stopped, if the web application goes down (for instance if the server shuts down). There are (at least) two standard compliant ways to acomplish this:
In the following we have choosen the second option.
A servler context listener receives notifications about changes to the servlet context of the web application it is part of. Documentation of the ServletContextListener interface can be found here. To receive notification events, the implementation class must be configured in the deployment descriptor for the web application. The two life cycle methods contextInitialized and contextDestroyed are suitable to start and stop ApacheDS.
After the server has been started from the Listener, it will be accessible from the outside via the network using LDAP. In order to demonstrate how to interact with the server from within the VM, a simple servlet is demonstrated. It allows you to communicate with the embedded server via web browser. This is so simple, because the server already lives within a web application, only a servlet has to added to act as an entry point. Our sample servlet will diplay the Root DSE of the server.
The following class diagram visualizes the complete example. EnvHelper is a simple helper class which will be used both by the listener and the servlet.
The ApacheDS core is a JNDI provider that manages a local hierarchical store of Attributes objects, based on the LDAP namespace. JNDI is the access API used to hide internals, and it is also used to configure the core.
In order to keep the source code of this example simple, the following [class|^EnvHelper.java|Download EnvHelper.java] is used to provide the environment to the other classes. Standard JNDI keys are used to tell JNDI what the provider is etc.
The class [StartStopListener|^StartStopListener.java|Download StartStopListener.java] implements ServletContextListener and therefore contains the following two life cycle methods:
First of all contextInitialized determines an appropriate working directory for the server. This directory is need to persist the partition data (entries). Our example uses a simple yet portable way for this task: the context attribute javax.servlet.context.tempdir.
Afterwards the method creates a configuration object which is suitable to start the server (class MutableServerStartupConfiguration). LDAP networking is enabled on port 10389, and the working directory is set. The configuration is combined with the environment from the helper class above. Invoking the constructor of InitialDirContext with these settings causes the ApacheDS core to start.
The method contextDestroyed is comparable. It uses a configuration suitable to shut down the server.
In order to execute the listener code, the class has to be defined in the deployment descriptor of a web application, as depicted below:
A standard web archive (war-File) is needed in order to deploy the application to a servlet container. The Resources area at the end of this page provides a zip-File which contains the file structure. A build script for Apache Ant is included as well.
The build script assumes that you have ApacheDS 1.0.1 and Tomcat 5.5.20 installed locally; it uses and (in the case of ApacheDS) copies the necessary your file from their lib directories to the lib directory of the web application. You will likely want to adjust the installation directories defined in the build.xml file.
After building the project, the classes folder will contain the compiled class files of the three Java classes above, and a properties file to configure the logging framework log4j. The lib folder will contain all jar-Files necessary, these are
The webapp target in the build.xml file (which is the default target) packs the files for the web application together in a web archive called ApacheDS.war.
In order to run the application within Tomcat, simply put the ApacheDS.war file in the webapps directory of your Tomcat installation and start the server. If you have the manager application enabled (as described here), you can see and "manage" (start/stop) ApacheDS within its list view.
ApacheDS is up and running within the servlet container. Besides the administration tool listing, it seems to be invisible. But because we have configured network access via port 10389, you can easily access the server with an arbitrary LDAP client from outside.
One option is a command line tool like ldapsearch (see ApacheDS Basic User's Guide for details on how to connect to ApacheDS with such tools in general). Here is an example how to connect as administrator (simple bind) and fetch the Root DSE of our embedded ApacheDS instance:
Another choice are graphical LDAP clients like JXplorer or Softerra LDAP Browser (see ApacheDS Basic User's Guide for details on how to connect to ApacheDS with such tools in general).
With the Eclipse RCP application LDAP studio, connecting goes like this:
In the Connections view, select "New connection ...". Within a wizard dialog, you provide the connection data (host name, port, bind DN and password).
After successfully connecting to the embedded ApacheDS, you can browse the tree, add and manipulate entries and so on. If you check the connection properties, you can study the Root DSE as well.
The web application described here has been successfully deployed on
Here is a screen shot of the web based administration console of WebSphere Application Server 6 with the ApacheDS.war deployed and running, no changes in the deployment archive were needed.
To finish with, here is a simple example on how to access the server internally.
The following servlet, which will be deployed together with the other two classes in the web archive, connects to ApacheDS directly, i.e. via the internal JNDI provider. No network access is needed. In the doGet method it performs a search operation against the Root DSE of the server, as the examples above do.
In order to make the servlet available to clients, it has to be declared in the deployment descriptor web.xml, here are the additions (a servlet named RootDseServlet for the class above, and a URL mapping)
Redeploy the web application. If you point to your tomcat server with the appropriate URL (http://localhost:8080/ApacheDS/RootDseServlet), you'll the the content of the Root DSE as depicted below:
[EnvHelper.java|^EnvHelper.java|Download file EnvHelper.java]
[StartStopListener.java|^StartStopListener.java|Download file StartStopListener.java]
[RootDseServlet.java|^RootDseServlet.java|Download file RootDseServlet.java]
[web.xml|^web.xml|Download file web.xml]
[ApacheDSWebApp.zip|^ApacheDSWebApp.zip|Download file ApacheDSWebApp.zip] all sources incl. Ant build.xml