Initial (nearly-empty) build.xml file.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c5a0d54
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+# Normal private files
+build/
+dist/
+adaptor-config.properties
+cacerts.jks
+keys.jks
+adaptor.crt
+gsa.crt
+
+# IntelliJ files
+workspace/
+classes/
+.idea
+Plexi.iml
+
+# NetBeans files
+nbproject/
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..a91cd6c
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,283 @@
+<project name="plexi.ldap" default="build" basedir=".">
+  <description>LDAP Adaptor</description>
+  <tstamp/>
+  <property name="src.dir" location="src"/>
+  <property name="test.dir" location="test"/>
+  <property name="test.class" value="*Test"/>
+  <property name="build.dir" location="build"/>
+  <property name="build-src.dir" location="${build.dir}/src"/>
+  <property name="build-test.dir" location="${build.dir}/test"/>
+  <property name="build-instrument.dir" location="${build.dir}/instrument"/>
+  <property name="adaptor.clone.dir" location="lib/plexi"/>
+  <!-- Used for checking if adaptor.jar has been changed. -->
+  <property name="adaptor.jar.default"
+    value="${adaptor.clone.dir}/build/dist/adaptor/adaptor-withlib.jar"/>
+  <property name="adaptor.jar" value="${adaptor.jar.default}"/>
+  <property name="dist.dir" location="dist"/>
+  <property name="javadoc.dir" location="${build.dir}/javadoc"/>
+  <property name="resource.dir" location="resources"/>
+  <property name="lib.dir" location="lib"/>
+  <property name="junit.jar" location="${lib.dir}/junit-4.8.2.jar"/>
+  <property name="adaptor.class"
+    value="com.google.enterprise.adaptor.ldap.LdapAdaptor"/>
+  <property name="adaptor.args" value=""/>
+  <property name="cobertura.dir" value="${basedir}/../cobertura/"/>
+  <!-- Adaptor suffix for distribution files. Useful for placing version numbers
+       on our jars. -->
+  <condition property="adaptor.suffix" value="-${adaptor.version}">
+    <isset property="adaptor.version"/>
+  </condition>
+  <!-- If adaptor.version isn't set, simply use the current date. -->
+  <property name="adaptor.suffix" value="-${DSTAMP}"/>
+
+  <path id="adaptor.build.classpath">
+<!--
+    <fileset dir="${lib.dir}">
+    </fileset>
+-->
+    <pathelement location="${adaptor.jar}"/>
+  </path>
+
+  <path id="adaptor.run.classpath">
+    <path refid="adaptor.build.classpath"/>
+  </path>
+
+  <path id="cobertura.classpath">
+    <fileset dir="${cobertura.dir}" erroronmissingdir="false">
+      <include name="cobertura.jar"/>
+      <include name="lib/**/*.jar"/>
+    </fileset>
+  </path>
+
+  <target name="-check-instrument-uptodate">
+    <uptodate property="instrument.uptodate"
+      targetfile="${build-instrument.dir}/cobertura.ser">
+      <srcfiles dir="${build-src.dir}"/>
+    </uptodate>
+  </target>
+
+  <target name="build"
+    depends="-real-build,-check-instrument-uptodate,clean-instrument"
+    description="Build source"/>
+
+  <target name="-plexi-check-submodule">
+    <condition property="plexi.is-not-submodule">
+      <not>
+        <equals arg1="${adaptor.jar.default}" arg2="${adaptor.jar}"/>
+      </not>
+    </condition>
+    <condition property="tmp.plexi.valid-setup">
+      <or>
+        <isset property="plexi.is-not-submodule"/>
+        <available file="${adaptor.clone.dir}/.git"/>
+      </or>
+    </condition>
+    <fail unless="tmp.plexi.valid-setup">Invalid setup:
+No lib/plexi submodule and using default adaptor.jar property.
+
+You need to run "git submodule init; git submodule update" to initialize the
+lib/plexi submodule or add the the command line argument
+-Dadaptor.jar=path/to/adaptor-withlib.jar to point to the adaptor library.
+    </fail>
+  </target>
+
+  <target name="-plexi-test-uptodate" depends="-plexi-check-submodule">
+    <condition property="plexi.uptodate">
+      <or>
+        <isset property="plexi.is-not-submodule"/>
+        <uptodate targetfile="${adaptor.jar}">
+          <srcfiles dir="${adaptor.clone.dir}"
+            excludes=".git/** build/** dist/** **.swp"/>
+        </uptodate>
+      </or>
+    </condition>
+  </target>
+
+  <target name="-plexi-build" depends="-plexi-test-uptodate"
+    unless="plexi.uptodate">
+    <echo message="Detected Plexi changes. Re-packaging Plexi..."/>
+    <ant antfile="${adaptor.clone.dir}/build.xml" dir="${adaptor.clone.dir}"
+      target="package" inheritAll="false">
+      <property name="adaptorlib.suffix" value=""/>
+    </ant>
+  </target>
+
+  <target name="-real-build" depends="-plexi-build">
+    <mkdir dir="${build-src.dir}"/>
+
+    <javac srcdir="${src.dir}" destdir="${build-src.dir}" debug="true"
+      includeantruntime="false" encoding="utf-8">
+      <compilerarg value="-Xlint:unchecked"/>
+      <classpath refid="adaptor.build.classpath"/>
+    </javac>
+
+    <mkdir dir="${build-test.dir}"/>
+    <!-- Compile JUnit helper -->
+    <javac srcdir="${lib.dir}" destdir="${build-test.dir}" debug="true"
+      includeantruntime="true" encoding="utf-8">
+      <compilerarg value="-Xlint:unchecked"/>
+      <classpath location="${junit.jar}"/>
+      <include name="JUnitLogFixFormatter.java"/>
+    </javac>
+
+    <!-- Compile tests, excluding example tests. -->
+    <javac srcdir="${test.dir}" destdir="${build-test.dir}" debug="true"
+      includeantruntime="false" encoding="utf-8">
+      <compilerarg value="-Xlint:unchecked"/>
+      <classpath refid="adaptor.build.classpath"/>
+      <classpath location="${build-src.dir}"/>
+      <classpath location="${junit.jar}"/>
+    </javac>
+  </target>
+
+  <target name="-discover-version" unless="adaptor.version">
+    <exec executable="git" outputproperty="adaptor.version"
+      logError="true" failifexecutionfails="false">
+      <arg value="describe"/>
+      <arg value="--always"/>
+    </exec>
+    <!-- Set version if git describe failed. -->
+    <property name="adaptor.version" value="unknown"/>
+  </target>
+
+  <target name="dist" description="Generate distribution binaries"
+    depends="clean,test,package"/>
+
+  <target name="package" description="Generate binaries"
+    depends="build,javadoc,-discover-version">
+    <property name="dist.staging.dir" value="${build.dir}/dist/staging"/>
+
+    <delete dir="${build.dir}/dist"/>
+    <delete dir="${dist.dir}"/>
+
+    <mkdir dir="${build.dir}/dist"/>
+    <mkdir dir="${build.dir}/dist/staging"/>
+    <mkdir dir="${dist.dir}"/>
+
+    <!-- Concatenate dependent JARs together into a comma-delimited list. -->
+    <pathconvert pathsep=" " refid="adaptor.run.classpath"
+      property="tmp.adaptor.classpath">
+      <mapper type="flatten"/>
+      <map from="" to="lib/"/>
+    </pathconvert>
+    <jar destfile="${dist.staging.dir}/adaptor-ldap${adaptor.suffix}.jar"
+      basedir="${build-src.dir}">
+      <manifest>
+        <attribute name="Main-Class" value="${adaptor.class}"/>
+        <attribute name="Class-Path" value="${tmp.adaptor.classpath}"/>
+        <section name="com/google/enterprise/adaptor/ldap/">
+          <attribute name="Implementation-Title"
+            value="Google LDAP Adaptor"/>
+          <attribute name="Implementation-Vendor" value="Google Inc."/>
+          <attribute name="Implementation-Version"
+            value="${adaptor.version}"/>
+        </section>
+      </manifest>
+    </jar>
+
+    <!-- lib/ -->
+    <!-- Concatenate dependent JARs together into a comma-delimited list. -->
+    <pathconvert pathsep="," refid="adaptor.run.classpath"
+      property="tmp.adaptor.fileset">
+      <!-- We remove the lib.dir from the paths to prevent trouble with comma
+           and space in lib.dir. It also makes it nicer <echo>ing
+           tmp.adaptorlib.fileset. -->
+      <map from="${lib.dir}/" to=""/>
+    </pathconvert>
+    <copy todir="${dist.staging.dir}/lib" flatten="true">
+      <fileset dir="${lib.dir}" includes="${tmp.adaptor.fileset}"/>
+    </copy>
+
+    <!-- adaptor-ad-withlib.jar -->
+    <jar filesetmanifest="mergewithoutmain"
+      destfile="${dist.staging.dir}/adaptor-ldap${adaptor.suffix}-withlib.jar">
+      <zipfileset
+        src="${dist.staging.dir}/adaptor-ldap${adaptor.suffix}.jar"/>
+      <zipgroupfileset dir="${dist.staging.dir}/lib"/>
+      <manifest>
+        <attribute name="Main-Class" value="${adaptor.class}"/>
+      </manifest>
+    </jar>
+
+    <!-- adaptor-bin.zip -->
+    <move file="${dist.staging.dir}"
+      tofile="${build.dir}/dist/adaptor-ldap${adaptor.suffix}"/>
+    <zip destfile="${dist.dir}/adaptor-ldap${adaptor.suffix}-bin.zip"
+      basedir="${build.dir}/dist/adaptor-ldap${adaptor.suffix}"/>
+  </target>
+
+  <target name="clean" description="Remove build output">
+    <delete dir="${build.dir}"/>
+    <delete dir="${dist.dir}"/>
+  </target>
+
+  <target name="javadoc" description="Build JavaDocs">
+    <javadoc sourcepath="${src.dir}" destdir="${javadoc.dir}"
+        overview="${src.dir}/overview.html">
+      <classpath refid="adaptor.build.classpath"/>
+      <arg value="-quiet"/>
+      <arg value="-notimestamp"/>
+    </javadoc>
+  </target>
+
+  <target name="run" depends="build" description="Run adaptor">
+    <java classpath="${build-src.dir}" fork="true" classname="${adaptor.class}">
+      <classpath refid="adaptor.run.classpath"/>
+      <sysproperty key="java.util.logging.config.file"
+        value="logging.properties"/>
+      <sysproperty key="javax.net.ssl.keyStore" file="keys.jks"/>
+      <sysproperty key="javax.net.ssl.keyStoreType" value="jks"/>
+      <sysproperty key="javax.net.ssl.keyStorePassword" value="changeit"/>
+      <sysproperty key="javax.net.ssl.trustStore" file="cacerts.jks"/>
+      <sysproperty key="javax.net.ssl.trustStoreType" value="jks"/>
+      <sysproperty key="javax.net.ssl.trustStorePassword" value="changeit"/>
+      <arg line="${adaptor.args}"/>
+    </java>
+  </target>
+
+  <target name="coverage" depends="instrument,test,coverage-report"
+    description="Run instrumented tests and generate coverage report"/>
+
+  <target name="test" depends="build" description="Run JUnit tests">
+    <junit printsummary="yes" haltonfailure="yes" forkmode="once" fork="true"
+      dir="${basedir}" maxmemory="512m">
+      <sysproperty key="net.sourceforge.cobertura.datafile"
+        file="${build-instrument.dir}/cobertura.ser"/>
+      <classpath refid="adaptor.run.classpath"/>
+      <classpath refid="cobertura.classpath"/>
+      <classpath location="${junit.jar}"/>
+      <classpath location="${build-instrument.dir}"/>
+      <classpath location="${build-src.dir}"/>
+      <classpath location="${build-test.dir}"/>
+      <formatter type="plain" usefile="false"/>
+      <formatter classname="JUnitLogFixFormatter" usefile="false"/>
+      <batchtest>
+        <fileset dir="${test.dir}">
+          <include name="**/${test.class}.java"/>
+        </fileset>
+      </batchtest>
+    </junit>
+  </target>
+
+  <target name="instrument" depends="build" description="Instrument classes">
+    <taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
+    <cobertura-instrument datafile="${build-instrument.dir}/cobertura.ser"
+      todir="${build-instrument.dir}">
+      <auxClassPath>
+        <path refid="adaptor.build.classpath" />
+      </auxClassPath>
+      <fileset dir="${build-src.dir}"/>
+    </cobertura-instrument>
+  </target>
+
+  <target name="clean-instrument" unless="instrument.uptodate"
+    description="Delete instrumented classes">
+    <delete dir="${build-instrument.dir}"/>
+  </target>
+
+  <target name="coverage-report" description="Generates code coverage report">
+    <taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
+    <cobertura-report datafile="${build-instrument.dir}/cobertura.ser"
+      srcdir="${src.dir}" destdir="${build.dir}/coverage"/>
+  </target>
+</project>